首页 > 解决方案 > 赋值运算符是否调用复制构造函数?

问题描述

#include<iostream>
using namespace std;
class test
{
    int *p;
public:
    test(){p=new int(0);}
    test(const test &src)
    {
        p=new int(*src.p);
    }
    ~test(){delete p;}
    void show(){cout<<*p<<" at "<<p<<endl;}
    void setx(int a)
    {
        *p=a;
    }
};
int main()
{
    test a,b;
    a.setx(10);
    a.show();
    b=a;
    b.show();
    test c=a;
    c.show();
}

在 main() 内部,test c=a调用复制构造函数并为整数分配内存。没问题,两者都c.p指向a.p不同的内存位置。但该行b=a导致b.pa.p指向相同的内存位置。我创建了自己的复制构造函数,b.p并且a.p应该指向不同的内存位置。这里发生了什么?

编辑:确切地说,我的问题是隐式定义的复制构造函数和隐式定义的复制赋值运算符有什么区别?

标签: c++classobjectpointers

解决方案


b=a; 

这里也完成了逐位复制(ap 和 bp 指向同一位置),它不会调用复制构造函数,因为在定义 b 时调用构造函数(默认构造函数)。所以你必须重载=运算符

test &operator =(const test &src)
{
    *this->p=*src.p;    //copy value not address 

     return *this;
}

将此添加到您的类测试中,您需要检查内存是否被 new 分配,因为 new 可能无法分配请求的内存。

但是这里调用了复制构造函数

test c=a;

推荐阅读