C++搞懂深拷贝初始化=与赋值(运算符重载)=的区别

C++搞懂深拷贝初始化=与赋值(运算符重载)=的区别

C++构造函数用=与()不完全一样,注意使用=时c++中临时变量不能作为非const的引用参数,不论是=运算符重载还是构造函数,否则可能出现以下错误

在这里插入图片描述
具体可以参考《C++ prime plus第六版》360页
在这里插入图片描述

代码

今天在学习右值引用时,遇到了深拷贝问题,以前也知道深拷贝与浅拷贝的区别,今天的疑问是,为什么不用重载=操作符在初始化时实现深拷贝,与赋值时=号的区别。

#include <iostream>
#include <functional>
using namespace std;

class Test
{
private:
    int *data;
    int s_size;
public:
    Test(size_t size):s_size(size){
        data=new int[s_size];
        cout<<data<<endl;
    }
    Test(Test & t){//②

        data=new int[t.s_size];
        cout<<"&&&"<<data<<endl;
    }
    void operator=(const Test t){
        if(t.data==nullptr){
            cout<<"error"<<endl;
            return;
        }
        if(data!=nullptr){
           delete [] data;
        }
        data=new int[t.s_size];
        cout<<"====="<<endl;
    }
    void data_addr(){
        cout<<data<<endl;
    }
    void output(int x, int y)
    {
        cout << "x: " << x << ", y: " << y << endl;
    }
    int m_number = 100;
    ~Test(){
        delete [] data;
    }
};

int main(int argc,char *argv[])
{
    cout<<1<<endl;
    Test t(100);//调用有参构造函数
    cout<<2<<endl;
    Test b=t;//调用类引用构造函数
    b.data_addr();
    cout<<3<<endl;
    Test c(b);//调用类引用构造函数
    c.data_addr();
    cout<<4<<endl;
    Test d(200);//调用有参构造函数
    cout<<5<<endl;

    b.data_addr();
    cout<<6<<endl;
    d=b;//调用=号重载函数
    d.data_addr();
    cout<<7<<endl;
    b.data_addr();
    
    return 0;
}


运行结果:
在这里插入图片描述

结论

采用=号初始化时,如2,若没有复制构造函数,还采用编译器自带的等号进行浅拷贝,编写了复制构造函数后,如②,不论是=还是()达到的效果都是深拷贝。而赋值时的=号,如5,若没有重载=操作符的函数则是编译器自带的等号进行浅拷贝,编写了=号操作符的函数后,如②达到深拷贝。这两个在调用时不会混乱,一个就是初始化,一个就是赋值。而且在编写参数时,最好使用引用调用,否则会产生错误,因为同一内存被多次析构。

复制构造函数的参数不允许出现类的类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GVyEiR5z-1620290547524)(C:\Users\wei\AppData\Roaming\Typora\typora-user-images\image-20210506163147381.png)]
把②去掉后的输出:
在这里插入图片描述
如果没有拷贝赋值函数(运算符重载=)则运行编译器自带的浅拷贝赋值函数;

采用值传递的方式则调用编写的复制构造函数,深拷贝。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J5XV3PbH-1620290547532)(C:\Users\wei\AppData\Roaming\Typora\typora-user-images\image-20210506164111063.png)]

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值