C ++ get和typecasting之间的用法区别是什么?我应该使用哪一个?

时间:2012-04-20 17:29:41

标签: c++ casting

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

3 个答案:

答案 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 ++理念:提供所有工具,让用户做好或坏。

我希望这是有道理的。