问题1>以下代码含义是什么以及赋值顺序是什么?
ClassName a1, a2, a3;
a1 = a2 = a3;
首先将a3的值分配给a2然后分配?到a1。
问题2>以下代码含义是什么?
ClassName a1, a2, a3;
(a1 = a2) = a3;
问题3> 鉴于如下课程:
class A
{
...
}
为了支持以下操作,必须定义哪些运算符?
A a1, a2, a3;
(a1 = a2) = a3;
答案 0 :(得分:9)
问题1
此:
a1 = a2 = a3;
相当于:
a1 = (a2 = a3);
对于原始类型或POD,这相当于:
a2 = a3;
a1 = a2;
对于用户定义的类型,它等同于:
a1.operator=(a2.operator=(a3));
如果你没有定义自己的operator=
重载,那么这与基元类型相同。
问题2
此:
(a1 = a2) = a3;
仅适用于用户定义的类型。它相当于:
a1.operator=(a2).operator=(a3);
如果使用编译器提供的运算符,则相当于:
a1 = a2;
a1 = a3;
问题3
不需要定义运算符,因为如果您不编写自己的运算符,编译器会提供复制赋值运算符实现。
答案 1 :(得分:3)
问题1:
评估顺序从右到左执行,因此a1 = a2 = a3
相当于a2 = a3; a1 = a2;
问题2:
如果operator=
尚未重新定义,则表示a1 = a3
。
问题3:
没什么,它按原样运作。