C++ 如何支持(a=b)=c?
问题1>以下代码的含义是什么,赋值顺序是什么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
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
以外的对象的引用,这是不合理的,但它破坏了等价性。。。