在C++中重载+=运算符

4
如果我已经重载了operator+和operator=,我是否仍然需要重载operator+=以使以下内容正常工作:
MyClass mc1, mc2;
mc1 += mc2;

13
试一试,亲身体验。这是一个非常快速的测试。 - Brian
5
获得经验结果很容易,但有时您仍然需要一些解释。 - Artem Barger
1
@Artem 当然,有时候,在这种情况下,它甚至无法编译,并且与语言语义的复杂特性无关 - 只需选择任何有关C ++的参考资料,它就会告诉您有关运算符重载的足够信息。 - MadH
4个回答

26

是的,您也需要定义它。

然而,一种常见的技巧是定义operator+=,然后通过它来实现operator+,就像这样:

MyClass operator+ (MyClass lhs, const MyClass& rhs){
  return lhs += rhs;
}

如果你反过来实现(使用+来实现+=),在+=运算符中会产生一个不必要的复制操作,这可能会成为性能敏感代码中的问题。


虽然有点老,但最好还是通过值传递 lhs 而不是手动复制。 - GManNickG
3
@GMan: pf,你现在只是在炫耀。现在纠正我的代码不公平。我正在忙于我的硕士论文而惊慌失措!不能指望我此时能写出有意义的代码!;) (另外,已经修复) - jalf
2
@GMan:如果我没记错的话,有一次我看到 return lhs += rhs; 可能是一种性能下降,因为编译器很难弄清楚 += 返回的是 lhs,这使得应用 RVO 变得困难。那是十年前的事了,也许现在的编译器已经足够聪明了,但我还是会坚持使用 lhs += rhs; return lhs; 以防万一。另外,@jalf,祝你好运! - sbi
@jaif,当重载运算符'+'并像您所说的传递参数时,'MyClass operator+(MyClass lhs, const MyClass& rhs)'编译器(在CentOS中使用gcc)会给出错误--> 'MyClass MyClass::operator+(Counter,const Counter&)'必须采用零个或一个参数。为什么会这样? - kaushik
@kaushik:因为你做错了。你可以将operator+定义为成员函数,这种情况下它只有一个参数(另一个参数默认是this),或者(更常见的方式)你可以将其定义为自由函数(非成员函数),它需要两个参数。你试图将其定义为带两个参数的成员函数,这是没有意义的。 :) - jalf
显示剩余2条评论

8

operator+=并不是由+和=组成的,因此您需要显式地重载它,因为编译器不知道如何为您构建拼图。但是您仍然可以通过在operator+=内使用已定义/重载的运算符来受益。


7
是的,你需要。

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接