2011-09-09 29 views

回答

10

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

例子:

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

分配给c返回c本身比起来EOF之后。用户期望您的item类的行为类似。

5

与无效签名不允许链接的任务:

a = b = c; 

(看约翰的回答基于任务返回指定值的使用模式的一个例子)

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

+0

关键是这是什么内置的类型 –

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引用本身。

+1

不仅如此,声明'operator ='返回'void',你将无法使用任何表达式的赋值结果。 –

相关问题