2
#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 返回一个副本。

4

3 回答 3

5

唯一的区别是类型转换可以是隐式的。

int i = a;

请注意,c++11 允许您强制强制转换运算符被显式调用。

explicit operator int() { return k; }
于 2012-04-20T17:33:54.513 回答
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
}

一般来说,我完全避免使用强制转换运算符,因为我更喜欢显式强制转换。

于 2012-04-20T17:34:19.410 回答
0

它返回返回类型是什么。如果你投射到一个参考,那么这就是你得到的。你两次都在做一个副本。

“差异”是您的方法所做的。您的“演员”可以向其添加 5,然后将其返回。或者你想要的任何东西。

至于适当性,正如克里斯在第一条评论中所说,通常是“你的班级是不是?” 键入问题。运算符应该用于常见的转换,因为您的类作为某种东西运行,而不仅仅是从中提取某些东西。这就是为什么它将字符串转换为整数的单独函数,而不仅仅是对字符串类的强制转换。而复数类型通常可以直接转换为 double 或 int,尽管这会从中剥离信息。转换可能被“滥用”实际上是一些现代语言不允许运算符重载的原因。其他人采取的方法虽然可以被滥用,但也可以很棒。这就是 C++ 在大多数事情上的理念:提供所有工具,让用户用它们做好事或坏事。

我希望这是有道理的。

于 2012-04-20T17:36:20.763 回答