C++之深拷贝与浅拷贝的区别

1.什么拷贝构造函数?

同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或称拷贝是完全可行的。

这个拷贝过程只需要拷贝数据成员,而函数成员是共用的(只有一份拷贝)。在建立对象时可用同一类的另一个对象来初始化该对象的存储空间,这时所用的构造函数称为拷贝构造函数。

2.深拷贝与浅拷贝的区别?

首先简单的理解就是:

假如B复制A,如果改变A,则B也被改变,就是浅拷贝

假如B复制A,A改变,则B不变,就是深拷贝。

更深层的理解:

对于浅拷贝来说,只是增加了一个指针指向已经存在的内存。当浅拷贝复制引用属性时,仅仅复制指针值,没有复制指向的对象。

 对于深拷贝来讲,它完成复制一份该属性指向的对象。即就是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向新的内存。

 接下来通过代码展示深拷贝和浅拷贝的区别:

#include<stdio.h>

class Mystring
{
 private:
       char* str;
 public:

      Mystring(const Mystring& ms):str(ms.str) //浅拷贝
      {}       

       Mystring(const char* p=nullptr):str(nullptr)  //深拷贝
       {
           if(p!=nullptr)
           {
              int len=strlen(p)+1;
              str=new char[len];    //使用new申请内存空间
              strcpy_s(str,len,p);
            }
        } 

       ~Mytring()  //析构函数
       {
           if(str!=nullptr)  
           {
                delete []str;
           }
       }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十七^O^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值