浅拷贝与深拷贝

参照百度经验,复制构造函数有深拷贝和浅拷贝两种,其主要区别是复制指针时是否重新创建内存空间。

以个人的理解,一个比较形象的例子:

一位蜡像师要为你做蜡像,再现的情景是你指着花丛中最艳丽的一朵花,这时候蜡像师就要再塑造一个你,蜡像和你一模一样 但作为两个事物 占据不同的空间,而雕像的手指指向的方向便是一个问题,是指向你正在指向的花呢,还是另雕刻出一朵?

而我们复制一个对象的时候,也会出现这个问题,浅拷贝而来的对象中,如果有指针类型,那么他指向的内存空间会是被复制的对象中指针指向的内存空间,也就是指向了同一朵花,而深拷贝则是又开辟了一块内存空间,复制而来的对象的指针指向于此。


默认的拷贝构造函数属于浅拷贝:

#include <iostream>
#include <string.h>

using namespace std;

class dala_da{
public:
    int da;
    char *la;
    //dala_da(dala_da &y);
    dala_da(int, char*);
    void show();
    ~dala_da();
};

dala_da::dala_da(int i, char *j){
    da=i;
    la=new char[i];
    la=j;
}

/*dala_da::dala_da(dala_da &y){
    da=y.da;
    la=new char[da];
    strcpy(la,y.la);
}*/

void dala_da::show(){
    cout << "  da的数值:" << this->da << "  da的地址:" << (void*)&this->da << "  " << "  la的字符串:" << this->la <<"  la字符串首地址:" << (void*)this->la << endl;
}

dala_da::~dala_da(){
    cout << "析构函数调用中..." <<endl;
    delete[] la;
}

int main(){

    dala_da A(10,"hello");
    dala_da B=A;
    A.show();
    B.show();
    return 0;
}



运行结果:


由例子我们可以发现,对象A与B中的la指针都指向了0x46e075这个位置,da的内存地址不相同。主函数运行结束是,A和B调用析构函数,这时候一个关键的问题便是0x46e075这个地方被释放了两遍。

而深拷贝则可以避免这个结果:(把上面代码中的拷贝构造函数注释去掉)


A和B的la指针分别指向了不同区域,但其存放的字符串是相同的。这样A对象的字符串更改便不会影响对象B了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值