C++ get 和类型转换之间的用法有什么区别?我应该使用哪一个?


#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 个,然后返回它。 或者任何你想要的东西。

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

我希望这是有道理的。

相关内容

最新更新