C++ 重载+;=在c++;

C++ 重载+;=在c++;,c++,operators,operator-overloading,operator-keyword,C++,Operators,Operator Overloading,Operator Keyword,如果我重载了运算符+和运算符=我还需要重载吗 运算符+=对于类似的操作: MyClass mc1, mc2; mc1 += mc2; 是的,您知道。运算符+=不是+和=,因此您确实需要显式重载它,因为编译器不知道如何为您构建谜题。但通过在操作符+=中使用已经定义/重载的操作符,您仍然能够从中获益 是的,您也需要定义它 然而,一个常见的技巧是定义操作符+=,然后用它来实现操作符+,如下所示: MyClass operator+ (MyClass lhs, const MyClass& r

如果我重载了运算符+和运算符=我还需要重载吗 运算符+=对于类似的操作:

MyClass mc1, mc2;
mc1 += mc2;

是的,您知道。

运算符+=不是+和=,因此您确实需要显式重载它,因为编译器不知道如何为您构建谜题。但通过在操作符+=中使用已经定义/重载的操作符,您仍然能够从中获益

是的,您也需要定义它

然而,一个常见的技巧是定义
操作符+=
,然后用它来实现
操作符+
,如下所示:

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

如果您使用另一种方法(使用+实现+=),则+=运算符中会出现不必要的复制操作,这可能是性能敏感代码中的一个问题。

如果这里的真正问题是“我不想编写大量重复的运算符,请告诉我如何避免它”,那么答案可能是:


不过,语法看起来有点复杂。因为我自己从未使用过它,所以我不能向您保证它真的很简单。

自己试试看。这是一个非常快的测试。很容易获得经验结果,但有时你需要一些解释。“有时候,在这种情况下,它甚至不会编译,也不会涉及语言语义的复杂特征——只要选择C++上的任何引用,它就可以告诉你操作符重载旧的,我知道,但是最好只是按值获取
lhs
,而不是手动复制。@GMan:你说得对。不知道为什么我第一次没这么做。认为它是固定的。jalf:如果你想变得非常简洁,
返回lhs+=rhs:)@格曼:pf,现在你只是在炫耀。现在更正我的代码是不公平的。我正忙着为我的硕士论文而惊慌失措!现在不能指望我写合理的代码!;)(也修复了)@GMan:IIRC,我曾经被证明
返回lhs+=rhs
可能是一种悲观的说法,因为编译器很难发现
+=
返回
lhs
,这使得应用RVO变得很困难。那是十年前的事了,也许编译器足够聪明,可以做到这一点,但我会坚持使用
lhs+=rhs;返回lhs以防万一。还有,@jalf,祝你好运!