如何选择 C++ 中的运算符重载?
How to choose which operator overload in C++?
我正在学习 C++ 并创建一个简单的 class、tstring
,定义为:
n
一个字符串中的字符数;
ntotal
tstring中的字符总数;
p
,指向包含数据的区域的指针。
因此,这个class由静态部分(n
、ntotal
和p
)和动态部分(数据本身)组成。
我创建了三个构造函数:
- 一个没有参数;
- 一个拷贝构造函数;
- 一个采用 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(const char *)
构造函数为您处理转换。这样你就可以免费获得与 C 字符串的连接。
然后您会注意到 tstring
+ char []
不会产生与 char []
+ tstring
相同的结果。那是因为 first 将调用您的转换构造函数,而 second 将找不到任何匹配的运算符。
由于不对称 operator+
是违反直觉的,您还应该提供非成员 operator+(const char *, tstring const &)
将其参数转发给它的 in-class 兄弟。
我正在学习 C++ 并创建一个简单的 class、tstring
,定义为:
n
一个字符串中的字符数;ntotal
tstring中的字符总数;p
,指向包含数据的区域的指针。
因此,这个class由静态部分(n
、ntotal
和p
)和动态部分(数据本身)组成。
我创建了三个构造函数:
- 一个没有参数;
- 一个拷贝构造函数;
- 一个采用 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(const char *)
构造函数为您处理转换。这样你就可以免费获得与 C 字符串的连接。
然后您会注意到 tstring
+ char []
不会产生与 char []
+ tstring
相同的结果。那是因为 first 将调用您的转换构造函数,而 second 将找不到任何匹配的运算符。
由于不对称 operator+
是违反直觉的,您还应该提供非成员 operator+(const char *, tstring const &)
将其参数转发给它的 in-class 兄弟。