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

Alp*_*ris 3 c++ operator-overloading operators

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

Sha*_*awn 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;
}
Run Code Online (Sandbox Code Playgroud)

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

(为了演示目的,所有示例都非常人为设计)