C++ 如何支持(a=b)=c?

C++ 如何支持(a=b)=c?,c++,C++,问题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; 问题1 这: 相当于: a1 = (a

问题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;

问题1

这:

相当于:

a1 = (a2 = a3);
对于基本类型或POD,这相当于:

a2 = a3;
a1 = a2;
a1.operator=(a2.operator=(a3));
a1.operator=(a2).operator=(a3);
a1 = a2;
a1 = a3;
对于用户定义的类型,它等效于:

a2 = a3;
a1 = a2;
a1.operator=(a2.operator=(a3));
a1.operator=(a2).operator=(a3);
a1 = a2;
a1 = a3;
如果您没有定义自己的
操作符=
重载,那么这将与基本类型相同

问题2

这:

仅适用于用户定义的类型。这相当于:

a2 = a3;
a1 = a2;
a1.operator=(a2.operator=(a3));
a1.operator=(a2).operator=(a3);
a1 = a2;
a1 = a3;
如果使用编译器提供的运算符,则这相当于:

a2 = a3;
a1 = a2;
a1.operator=(a2.operator=(a3));
a1.operator=(a2).operator=(a3);
a1 = a2;
a1 = a3;
问题3


不必定义运算符,因为如果您不编写自己的运算符,编译器将提供一个复制赋值运算符实现。

问题1

这:

相当于:

a1 = (a2 = a3);
对于基本类型或POD,这相当于:

a2 = a3;
a1 = a2;
a1.operator=(a2.operator=(a3));
a1.operator=(a2).operator=(a3);
a1 = a2;
a1 = a3;
对于用户定义的类型,它等效于:

a2 = a3;
a1 = a2;
a1.operator=(a2.operator=(a3));
a1.operator=(a2).operator=(a3);
a1 = a2;
a1 = a3;
如果您没有定义自己的
操作符=
重载,那么这将与基本类型相同

问题2

这:

仅适用于用户定义的类型。这相当于:

a2 = a3;
a1 = a2;
a1.operator=(a2.operator=(a3));
a1.operator=(a2).operator=(a3);
a1 = a2;
a1 = a3;
如果使用编译器提供的运算符,则这相当于:

a2 = a3;
a1 = a2;
a1.operator=(a2.operator=(a3));
a1.operator=(a2).operator=(a3);
a1 = a2;
a1 = a3;
问题3


不需要定义运算符,因为如果您不编写自己的运算符,编译器将提供一个复制赋值运算符实现。

问题1:

评估顺序从右到左执行,因此
a1=a2=a3
相当于
a2=a3;a1=a2

问题2:

如果未重新定义
运算符=
,则表示
a1=a3

问题3:


没有,它按原样工作。

问题1:

评估顺序从右到左执行,因此
a1=a2=a3
相当于
a2=a3;a1=a2

问题2:

如果未重新定义
运算符=
,则表示
a1=a3

问题3:


没什么,它是按原样工作的。

仅仅阅读这类问题就让我下定决心不再使用这种语法。@David,我也不喜欢这些:)+1对于第三个问题,尽管它将按原样编译,但您可能希望重载
A&A::operator=(const A&other){myvar=other.myvar;return*this;}
仅仅阅读这类问题就让我下定决心不再使用这种语法。@David,我也不喜欢这些:)+1对于第三个问题,尽管它将按原样编译,但您可能希望重载
A&A::operator=(const A&other){myvar=other.myvar;return*this;}
可能你的意思是说重载未重定义可能你的意思是说重载未重定义“这相当于:
a2=a3;a1=a2;
”,假设
操作符=
的合理实现。如果用户定义了
ClassName::operator=
以返回对
a2
以外的对象的引用,则这是不合理的,但它破坏了等价性……”,等价于:
a2=a3;a1=a2;
“假设
operator=
的合理实现。如果用户定义了
ClassName::operator=
以返回对
a2
以外的对象的引用,这是不合理的,但它破坏了等价性。。。