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

Overloading compound assignment operators in C++

本文关键字:复合 赋值运算符 C++ 重载      更新时间:2023-10-16

为什么当我们重载 += 运算符时需要返回对类的引用? 例如,为什么原型是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;
}

使复合运算符类成员和普通运算符独立是一个常见的样式建议;它允许第一个参数是不同类型的,只要它可以转换为foofoo b; foo a = 1 + b;

(所有示例都是非常精心设计的演示目的(

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

例如,在a += ...;中,此表达式的计算结果不可能不是left-hand-expression(即a += b + c + d;(。