屁宝Sault 2022-10-07 11:21 采纳率: 0%
浏览 37

C++赋值运算符连续赋值的顺序问题和原理

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),看来会优先执行赋值运算符右边的内容,不知道我想的对不对,也不知道这是如何实现的。

  • 写回答

2条回答 默认 最新

  • 真相重于对错 2022-10-07 12:26
    关注

    当然p2要变,后面的理解正确,因为操作符是类函数,修改this所有字段自然修改本身

    评论

报告相同问题?

问题事件

  • 修改了问题 10月7日
  • 创建了问题 10月7日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀