当我们重载+ =运算符以返回对该类的引用时,为什么必须这样做?
为什么原型是ClassName& operator += (const ClassName& instance)
而不是
void operator += (const ClassName& instance)
吗?
答案 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;
}
使复合运算符类成员和普通运算符独立存在是一种常见的样式建议;只要它可以转换为foo
:foo b; foo a = 1 + b;
(所有示例都是为演示目的而精心设计的)
答案 1 :(得分:-1)
这是因为operator +=
必须是left-hand-expression
。
例如,在a += ...;
中,此表达式的求值结果不会是left-hand-expression
(即a += b + c + d;
)。