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

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

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

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

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

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

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; 


 

你可能感兴趣的:(c,Class)