haoxiaolan 2022-01-28 12:30 采纳率: 35.7%
浏览 41
已结题

赋值运算符重载的问题

问题遇到的现象和发生背景
class person{
    
public:
    person(int a)
    {
        m_p = new int(a);
     } 
     
     
     ~person()
    {
        if(m_p != NULL)
        {
            delete m_p;
            m_p = NULL; 
         } 
    } 
    
    
    int *m_p;
    
    void operator=(person p)
    {
        if(this->m_p != NULL)
        {
            delete this->m_p;
            this->m_p = NULL; 
        }
    
        this->m_p = new int(*p.m_p);
    }
};
void text1()
{
    
    person p1(10);
    person p2(20);
    p2 = p1;
    cout<<"p1.age="<<*p1.m_p<<endl;
    cout<<"p2.age="<<*p2.m_p<<endl;
}

img

cout<<"p1.age="<<*p1.m_p<<endl; 输出一串数字 而不是 10
void operator=(person p) 写成 void operator=(person & p) 就可以正常运行

传值 不是创建一份 p1 的复制品
复制的p1 中的m_p 的指向 也是堆区的那块空间
解引用赋值到 p2创建的空间上 ( this->m_p = new int(*p.m_p);)
为啥输出的不是10 而是随机数

  • 写回答

2条回答 默认 最新

  • 奔腾的CPU 2022-01-28 15:29
    关注

    对两种写法的 p2 = p1 语句分类讨论:

    1. void operator=(person p)
      首先调用的是(合成)复制构造函数, 也就是是你所说的创建一份 p1 的复制品(假设为temp_p1), 然后调用赋值构造函数 (void operator=(person temp_p1)) 进行传值, 因此 p2 的输出是正确的, 但是临时对象在赋值过后是要被销毁的, 而复制构造函数中传入的参数为 p1 的引用, 所以最后销毁的也就是 p1 这个对象, 所以读到的值是错的, 至于为什么还能读到数值就不清楚了, 希望有大佬看到后解答一下。

    person(person const &p) // 产生临时对象所调用的复制构造函数
    {
    this->m_p = p.m_p;
    }

    1. void operator=(person &p)
      不产生临时对象, 所以自然也就不会调用析构函数。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月3日
  • 已采纳回答 3月26日
  • 创建了问题 1月28日

悬赏问题

  • ¥15 在不同的执行界面调用同一个页面
  • ¥20 基于51单片机的数字频率计
  • ¥50 M3T长焦相机如何标定以及正射影像拼接问题
  • ¥15 keepalived的虚拟VIP地址 ping -s 发包测试,只能通过1472字节以下的数据包(相关搜索:静态路由)
  • ¥20 关于#stm32#的问题:STM32串口发送问题,偶校验(even),发送5A 41 FB 20.烧录程序后发现串口助手读到的是5A 41 7B A0
  • ¥15 C++map释放不掉
  • ¥15 Mabatis查询数据
  • ¥15 想知道lingo目标函数中求和公式上标是变量情况如何求解
  • ¥15 关于E22-400T22S的LORA模块的通信问题
  • ¥15 求用二阶有源低通滤波将3khz方波转为正弦波的电路