【问题标题】:How to choose which operator overload in C++?如何在 C++ 中选择哪个运算符重载?
【发布时间】:2015-02-15 19:54:53
【问题描述】:

我正在学习 C++ 并创建一个简单的类 tstring,由以下人员定义:

  • n字符串中的字符数;
  • ntotal tstring 中的总字符数;
  • p,指向包含数据的区域的指针。

因此,此类由静态部分(nntotalp)和动态部分(数据本身)组成。

我创建了三个构造函数:

  • 一个不带参数的;
  • 一个拷贝构造函数;
  • 一个接受 C 字符串参数的构造函数。

我希望能够将一个 tstring 对象与一个 C 字符串连接起来,例如使用说明:

tstring x("Hello), y;
y = x + " World";

我认为我应该重载 + 运算符。但是我不明白我应该使用哪种方式在内部方式之间重载它:

tstring tstring::operator+(char string[])

或外部方式(使用 setter 和 getter 方法)

tstring operator+ (const tstring& myTstring, const char* string)

有人可以解释一下区别和最佳采用方式吗?

提前谢谢你!

【问题讨论】:

  • 对于这样的事情,我会使用“tstring tstring::operator+(char string[])”,因为您希望访问成员变量,而不必与类中的操作符函数成为朋友。跨度>
  • @thang 我不同意,问题在于调用char[] + tstring,在这种情况下不起作用(即使char[] 可以隐式转换为tstring,它也不会' t 被转换,因为它显示在左侧)。我认为将二元运算符声明为朋友是一个很好的经验法则。
  • @vsoftco,但是 "tstring operator+ (const tstring& myTstring, const char* string)" 不能解决这个问题,但现在你必须将该 operator+ 函数添加为好友。
  • 我要做的是声明一个隐式构造函数,它将char[] 转换为tstring,即tstring::tstring(char[]),然后简单地将operator+(tstring, tstring) 定义为朋友。把它当成朋友没什么不好,它不会比成员函数更破坏封装,而且它确实让生活更轻松。

标签: c++ class operator-overloading


【解决方案1】:

在这种情况下,您可能应该首先考虑串联两个tstrings。有了这个,您可能决定让您的 tstring(const char *) 构造函数为您处理转换。通过这种方式,您将免费获得与 C 字符串的连接。

然后你会注意到tstring + char [] 不会产生与char [] + tstring 相同的结果。那是因为 first 将调用您的转换构造函数,而 second 将找不到任何匹配的运算符。

由于具有不对称的operator+ 是违反直觉的,因此您还应该提供非成员operator+(const char *, tstring const &),它将其参数转发给其同级兄弟。

【讨论】:

  • 又是一个偏好问题,但我只声明一个friend operator+(tstring, tstring),并且使用隐式构造函数一切都会正常工作。
猜你喜欢
  • 2017-09-15
  • 2021-10-19
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 2010-09-30
  • 1970-01-01
相关资源
最近更新 更多