c++赋值运算符连续赋值的顺序问题
楼主刚开始学编程,正在学习c++,过程中遇到一点小疑惑,还望各位解惑
#include<iostream>
using namespace std;
class Person
{
public:
Person(int a)
{
m_age = new int(a);
}
void showage()
{
cout << "m_age=" << *m_age << endl;
}
//重载赋值运算符,让浅拷贝变深拷贝
Person& operator=(Person& p)
{
if (m_age != NULL)//释放堆区内存
{
delete m_age;
m_age = NULL;
}
m_age = new int(*p.m_age);
return *this;
}
~Person()
{
if (m_age != NULL)
{
delete m_age;
m_age = NULL;
}
}
private:
int* m_age;
};
void test1()
{
Person p1(10), p2(11), p3(12);
p1 = p2 = p3;//本质为什么不是p1.operator=(p2).operator=(p3),这样的话结果应该是p1=p3,p2不变才对呀!赋值运算符先执行等式右边的内容?
p1.showage();
p2.showage();
p3.showage();
}
int main()
{
test1();
system("pause");
return 0;
}
result:
m_age=12
m_age=12
m_age=12
这里我给赋值运算符进行了一个重载,用了连续赋值,按照之前重载加号和递增运算符的经验,我认为这个简化式子的本质是执行了**p1.operator=(p2).operator=(p3)**的操作,如果是这样,那么结果应该是p1的年龄等于p3,p2不变才对,但结果是三者相等,那么说赋值运算符先执行等式右边的内容?为了验证这一结论,我新增了一个加法运算符的重载
新增的两个函数
//重载加号运算符
Person& operator+(Person & p)
{
*m_age += *p.m_age;
return *this;
}
void test2()
{
Person p1(10), p2(11), p3(12);
p1 = p2 + p3;//p1.operator=(p2).operator+(p3)? 结果p1-23,p2-11,p3-12?还是p1-23,p2-23,p3-12?
p1.showage();
p2.showage();
p3.showage();
}
int main()
{
test2();
system("pause");
return 0;
}
result:
m_age=23
m_age=23
m_age=12
结果很明显,不是我想的执行
p1.operator=(p2).operator=(p3);
p1.operator=(p2).operator+(p3);
而是执行了
p1.operator=(p2.operator=(p3));
p1.operator=(p2.operator+(p3));
同样用系统默认的赋值运算符
int a=1,b=2,c=3;
a=b=c;
输出结果是a,b,c都为3(按照我之前的想法是a=c=3,b=2),看来会优先执行赋值运算符右边的内容,不知道我想的对不对,也不知道这是如何实现的。