深复制与浅复制(深拷贝与浅拷贝)

拷贝有两种:深拷贝,浅拷贝

当出现类的等号赋值时,会调用拷贝函数在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制。

当数据成员中没有指针时,浅拷贝是可行的。但当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,而导致指针悬挂现象。所以,这时,必须采用深拷贝。

深拷贝与浅拷贝的区别就在于深拷贝会在堆内存中另外申请空间来储存数据,从而也就解决了指针悬挂的问题。

简而言之,当数据成员中有指针时,必须要用深拷贝。

class A{
    char * c;
}a,b;
//浅复制不会重新分配内存
a=b;相当于
memcpy(&a,&b,sizeof(a));//a.c==b.c
//深复制需要自己处理里面的指针
class A{
    char * c;
    A& operator =(const A&b)
   {
      this.c=malloc(...);
     strcpy(this.c,b.c);
   }
}a,b;
//这个是深复制,它有自定义的复制函数,赋值时,对指针动态分配了内存
a=b; 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值