#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 返回一个副本。
唯一的区别是类型转换可以是隐式的。
int i = a;
请注意,c++11 允许您强制强制转换运算符被显式调用。
explicit operator int() { return k; }
他们都在返回副本。提供强制转换操作符通常是在需要强制转换时使用。例如,您可能会做这样的事情:
#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
}
一般来说,我完全避免使用强制转换运算符,因为我更喜欢显式强制转换。
它返回返回类型是什么。如果你投射到一个参考,那么这就是你得到的。你两次都在做一个副本。
“差异”是您的方法所做的。您的“演员”可以向其添加 5,然后将其返回。或者你想要的任何东西。
至于适当性,正如克里斯在第一条评论中所说,通常是“你的班级是不是?” 键入问题。运算符应该用于常见的转换,因为您的类作为某种东西运行,而不仅仅是从中提取某些东西。这就是为什么它将字符串转换为整数的单独函数,而不仅仅是对字符串类的强制转换。而复数类型通常可以直接转换为 double 或 int,尽管这会从中剥离信息。转换可能被“滥用”实际上是一些现代语言不允许运算符重载的原因。其他人采取的方法虽然可以被滥用,但也可以很棒。这就是 C++ 在大多数事情上的理念:提供所有工具,让用户用它们做好事或坏事。
我希望这是有道理的。