当我们重载+=运算符时,为什么有必要返回对类的引用?为什么原型是实例的ClassName& operator += (const ClassName& instance)
,而不是void operator += (const ClassName& instance)
?
当我们重载+=运算符时,为什么有必要返回对类的引用?为什么原型是实例的ClassName& operator += (const ClassName& instance)
,而不是void operator += (const ClassName& instance)
?
有几个原因。
这就是内置的+=
和伙伴们所做的事情; 如果没有一个非常好的理由和事实的文档证明它具有相同的功能,那么覆盖版本最好也要表现出相同的行为,否则使用它的人会期望它像内置版本一样工作,他们会感到不满。
内置版本之所以这样操作,是为了允许它们作为更大表达式的一部分使用,例如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;
(以上所有示例都是为演示目的而虚构的)
这是因为operator +=
必须是一个左值表达式
。
例如,在a += ...;
中,这个表达式的求值结果不可能不是一个左值表达式
(即a += b + c + d;
)。
a * (b += c);
的操作。内置复合运算符会返回值;重载运算符也应该这样做,以避免让人感到困惑。 - Shawn