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.
答案 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引用返回给自己。