C++ 在C+中重载复合赋值运算符+;

C++ 在C+中重载复合赋值运算符+;,c++,operator-overloading,operators,C++,Operator Overloading,Operators,为什么在重载+=运算符时需要返回对类的引用? 为什么原型是例如ClassName和operator+=(const ClassName和instance)而不是 void操作符+=(const ClassName和instance)?有几个原因 这就是内置的+=和朋友所做的;你的超负荷版本最好在没有很好的理由和事实文档的情况下也这样做,否则使用它的人希望它表现得像内置版本一样会感到不安 内置表达式的作用是允许它们作为更大表达式的一部分使用,如a+(b+=c) 它使得定义重载的运算符+()和复制构

为什么在重载+=运算符时需要返回对类的引用? 为什么原型是例如
ClassName和operator+=(const ClassName和instance)
而不是
void操作符+=(const ClassName和instance)

有几个原因

这就是内置的
+=
和朋友所做的;你的超负荷版本最好在没有很好的理由和事实文档的情况下也这样做,否则使用它的人希望它表现得像内置版本一样会感到不安

内置表达式的作用是允许它们作为更大表达式的一部分使用,如
a+(b+=c)

它使得定义重载的
运算符+()
和复制构造函数变得容易。考虑

class foo {
  foo& operator+=(const foo &b) {
    // Do stuff
    return *this;
  }
};
foo operator+(foo a, const foo &b) { // First argument passed by value, second by reference
  return a += b;
}
使复合运算符类成员和普通运算符独立是一种常见的风格建议;它允许第一个参数具有不同的类型,只要它可以转换为
foo
foob;foo a=1+b


(所有示例都是为了演示而精心设计的)

这是因为
运算符+=
必须是
左手表达式


例如,在
a+=
此表达式的求值结果不可能是
左手表达式
(即
a+=b+c+d;
)。

因此您可以执行类似
a*(b+=c)的操作。内置复合运算符返回值;所以应该使用重载运算符,以避免混淆人们。@Shawn,但我不建议将太多的变异运算符链接在一起。我认为链接两个或更多的变异运算符是未指明的行为。最后一个可能是真的,但很奇怪。通常,你应该用另一种方法来做。@Chipster,@Chipster什么,用非复合运算符来定义复合版本?仔细阅读,发现我错了。所以没关系。