如果我已经重载了operator+和operator=,我是否仍然需要重载operator+=以使以下内容正常工作:
MyClass mc1, mc2;
mc1 += mc2;
MyClass mc1, mc2;
mc1 += mc2;
是的,您也需要定义它。
然而,一种常见的技巧是定义operator+=
,然后通过它来实现operator+
,就像这样:
MyClass operator+ (MyClass lhs, const MyClass& rhs){
return lhs += rhs;
}
如果你反过来实现(使用+来实现+=),在+=运算符中会产生一个不必要的复制操作,这可能会成为性能敏感代码中的问题。
lhs
而不是手动复制。 - GManNickGreturn lhs += rhs;
可能是一种性能下降,因为编译器很难弄清楚 +=
返回的是 lhs
,这使得应用 RVO 变得困难。那是十年前的事了,也许现在的编译器已经足够聪明了,但我还是会坚持使用 lhs += rhs; return lhs;
以防万一。另外,@jalf,祝你好运! - sbioperator+
定义为成员函数,这种情况下它只有一个参数(另一个参数默认是this
),或者(更常见的方式)你可以将其定义为自由函数(非成员函数),它需要两个参数。你试图将其定义为带两个参数的成员函数,这是没有意义的。 :) - jalfoperator+=并不是由+和=组成的,因此您需要显式地重载它,因为编译器不知道如何为您构建拼图。但是您仍然可以通过在operator+=内使用已定义/重载的运算符来受益。
http://www.boost.org/doc/libs/1_38_0/libs/utility/operators.htm
语法看起来有点麻烦。虽然我自己从未使用过,但无法向您保证它确实很简单。