深拷贝和浅拷贝的根本区别是变量和指针内存申请方式的不同导致的,如果对一一个变量则不存在深拷贝和浅拷贝的区别,对于一些类中包含指针的需要进行动态分配内存的进行拷贝的时候会有深拷贝和浅拷贝的区别
事例如下:
1 #include<iostream> 2 3 using namespace std; 4 5 class CE 6 { 7 private: 8 int a; 9 public: 10 CE(int b) 11 {a=b;} 12 }; 13 int main() 14 { 15 CE A(100) 16 CE B=A; 17 return 0; 18 }
在该例子中class CE没有提供复制构造函数,所以编译器会提供默认的复制构造函数,默认的复制构造函数只是对新的对象的a进行赋值,即a=b操作,在此过程中不存在深拷贝和浅拷贝的区别
例2
class CE { private: int a; char *b; public: CE(int c,char *d) { a=c; b=d; } CE(const CE& e) { a=e.a; b=e.b; } //默认构造函数 CE(const CE& e) { a=e.a; b=new char [a]; if(b!=0) strcpy(b,e.b); } //深拷贝要提供的构造函数 } int main() { CE A(10,"hello"); CE B=A; return 0 }
在例2中类中包含指针,则如果不提供复制构造函数怎默认构造函数只是对指针的赋值,并没有重新开辟内存空间,和被复制的b指向同一块内存空间,这种就是浅拷贝,但是这种拷贝容易因为一个对象的析构导致共同指向的内存释放,从而另外一个对象的指针就是野指针了,如果按照例子中提供的复制构造函数,则b会从先心脾内存空间,两个对象中的b指向的也不是同一块内存空间,这样举不会出现上面出现的问题。