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

3

当我们重载+=运算符时,为什么有必要返回对类的引用?为什么原型是实例的ClassName& operator += (const ClassName& instance),而不是void operator += (const ClassName& instance)


6
因此,您可以执行诸如a * (b += c);的操作。内置复合运算符会返回值;重载运算符也应该这样做,以避免让人感到困惑。 - Shawn
@Shawn 虽然我不建议将太多的可变操作符链接在一起。我认为链接两个或更多的可变操作符是未指定的行为。 - user10957435
2个回答

5

有几个原因。

这就是内置的+=和伙伴们所做的事情; 如果没有一个非常好的理由和事实的文档证明它具有相同的功能,那么覆盖版本最好也要表现出相同的行为,否则使用它的人会期望它像内置版本一样工作,他们会感到不满。

内置版本之所以这样操作,是为了允许它们作为更大表达式的一部分使用,例如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;

(以上所有示例都是为演示目的而虚构的)


最后一个虽然可能是真的,但很奇怪。通常情况下,你应该反过来做。 - user10957435
@Chipster,并不是真的 - Evg
@Chipster,请问如何用非复合运算符来定义复合版本? - Shawn
仔细重新阅读了这个问题,意识到我是错的。所以不用理会了。 - user10957435

-1

这是因为operator +=必须是一个左值表达式

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


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