#include <iosteam>
using namespace std;
Class A
{
int k;
public:
int getK() { return k; }
operator int() { return k; }
};
int main()
{
A a;
cout << a.getK() << " " << int(a) << endl;
}
有什么区别,我应该使用哪一个?我想知道类型转换是否返回引用并且getK返回一个副本。
答案 0 :(得分:5)
唯一的区别是类型转换可能是隐含的。
int i = a;
请注意,c ++ 11允许您强制显式调用强制转换运算符。
explicit operator int() { return k; }
答案 1 :(得分:1)
他们都是复印件。提供铸造操作员通常是在需要铸造时。例如,您可能会这样做:
#include <iosteam>
using namespace std;
Class A
{
double k;
public:
A(double v) : k(v) {}
double getK() { return k; }
operator int() { return static_cast<int>(k); }
};
int main()
{
A a(3.14);
cout << a.getK() << " " << int(a) << endl; // 3.14 3
}
一般来说,我完全避免使用强制转换运算符,因为我更喜欢显式转换。
答案 2 :(得分:0)
返回返回类型。如果你转向参考,那就是你得到的。你两次做的都是制作副本。
“差异”是你的方法所做的。你的“演员”可以加5,然后返回它。或者你想要的任何东西。
至于适当性,正如克里斯在第一篇评论中所说的那样,它通常是“你的班级是不是?”类型问题。操作员应该进行常规转换,因为你的课程是作为某种东西运作的,而不仅仅是从中提取某些东西。这就是为什么它是一个单独的函数将字符串转换为整数,而不仅仅是字符串类的强制转换。虽然复数类型通常可以直接转换为double或int,但它会从中删除信息。转换可能被“滥用”实际上是为什么一些现代语言不允许运算符重载。其他人采取的方式虽然它可以被滥用,它也可以是很棒的。这就是大多数事情的C ++理念:提供所有工具,让用户做好或坏。
我希望这是有道理的。