为什么重载赋值运算符返回对类的引用?

时间:2011-09-09 11:11:37

标签: c++

class item {
public:
    item& operator=(const item &rh) {
        ...
        ...
        return *this;
    }
};

以下签名是错误的吗?

void operator=(const item &rh);

item a, b;
a = b; // equivalent to a.operator=(b); so there is no need to return this.

3 个答案:

答案 0 :(得分:10)

这不是“错误”,但令人惊讶。赋值评估目标对象。这就是内置意义。如果你为自己的班级定义不同,人们可能会感到困惑。

示例:

int c;
while((c = getchar()) != EOF) {
  // ...
}

c的作业已返回c,然后将其与EOF进行比较。用户希望您的item类行为相似。

答案 1 :(得分:5)

带有void的签名不允许链式赋值:

a = b = c;

(请查看Johannes关于基于赋值返回指定值的使用模式的另一个示例的答案。)

这就是为什么不鼓励使用这种签名的原因。但是,如果我没有弄错的话,你实际上可以使用这样的签名。

答案 2 :(得分:2)

这完全合法。但是当你宣布operator=时,你将无法进行“任务链”:

item a(X);
item b;
item c;
c = b = a;

参考允许修改返回值。由于operator=从右到左进行评估,因此我向您展示的用法正在发挥作用。

编辑此外,正如其他人所提到的,返回值通常用于while (a = cin.get()) != 'q')等表达式。但是你也可以声明运算符,如A operator=(const A&)(返回副本)或const A& operator(const A&)(返回const引用)。我的观点是:这个运算符可以返回任何,但惯用的方法是将非const引用返回给自己。