一、深拷贝与前拷贝的区别
1.浅拷贝:直接把原来对象的引用直接赋值给新的对象,并没有开辟一块新的内存空间,只是拷贝了一个指针,因此,新对象的值只是引用了旧的对象的数值。
2.深拷贝: 赋值的时候不是简单的引用旧的对象,而是重新创建一个新的对象,这个时候会需要开辟一块新的内存空间,再把旧的对象的各项数值全部拷贝赋值过来。所以新的对象是“值”而不是“引用”
其实深拷贝和浅拷贝只需要注意一点就好了,就是是否还需要申请新的内存空间,堆上的内存才需要深拷贝,比如说文件复制就是深拷贝,创建快捷方式就是浅拷贝。
二、为什么要使用深拷贝
我们希望在改变新的对象的时候,不改变原来的对象。
三、深拷贝的简单案例
如设计带指针的class的时候,我们必须要重载=,来定义一个拷贝赋值的函数,而拷贝赋值背后的依赖就是深拷贝。如果没有定义拷贝赋值函数当用户使用 s1=s2的时候,就会出现s1中的对象只是引用了s2对象的数值,当我们修改了s1的数值的时候,s2的数值也会发生变化,这样就很容易发生一些不必要的错误。class String的拷贝赋值的经典写法如下:
inline String&
String::operator = (const String& str)
{
if(m_data == str) { return *this; }
delete [] m_data;
m_data = new char[strlen(m_data) + 1);
strcpy(m_data, str.m_data);
returh *this;
}
(1)先判断是否自己给自己赋值。
(2)由于要创建的新的值,必须把自身的值给清理干净,否则会出现野指针的情况。
(3)返回类型是String&,因为用户可能会有连续赋值的操作,如s1=s2=s3,返回类型是void的话,执行完s2=s3之后,得到的s2是void型的,再执行s1=s2的话就会发生错误,因为拷贝赋值右边的参数是String型。
值得阅读:C++之浅拷贝、深拷贝及相关应用