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

时间:2019-11-27 19:37:03

标签: c++ operator-overloading operators

当我们重载+ =运算符以返回对该类的引用时,为什么必须这样做? 为什么原型是ClassName& operator += (const ClassName& instance)而不是
void operator += (const ClassName& instance)吗?

2 个答案:

答案 0 :(得分:4)

几个原因。

这就是内置+=和朋友所做的;您的重载版本最好在没有充分理由和事实证明的情况下以相同的方式运行,否则使用它的人希望它的行为像内置版本那样会感到沮丧。

内置表达式的作用是允许它们用作a + (b += c)之类的较大表达式的一部分。

它使根据operator+()定义重载的operator+=()和复制构造函数变得容易。考虑

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;
}

使复合运算符类成员和普通运算符独立存在是一种常见的样式建议;只要它可以转换为foofoo b; foo a = 1 + b;

,它就允许第一个参数具有不同的类型。

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

答案 1 :(得分:-1)

这是因为operator +=必须是left-hand-expression

例如,在a += ...;中,此表达式的求值结果不会是left-hand-expression(即a += b + c + d;)。