浅拷贝就比如像引用类型,而深拷贝就比如值类型。
一、浅拷贝:
浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。
举个例子,一个人一开始叫张三,后来改名叫李四了,可是还是同一个人,不管是张三中了一百万还是李四中了一百万,都是这个人中奖了。
浅拷贝就是对象的数据成员之间的简单赋值, 如你设计了一个没有类而没有提供它的复制构造函数,当用该类的一个对象去给令一个对象赋值时所执行的过程就是浅拷贝,如:
#include <iostream>
using namespace std;
class Str
{
public:
Str(int _data) : data(_data){}
int GetStr()
{
return data;
}
Str()
{
}
private:
int data;
};
void test()
{
Str s1(10);
Str s2;
s2 = s1;
cout << s2.GetStr() << endl;
}
int main()
{
test();
return 0;
}
运行结果为 :10;这就是一个浅拷贝的过程。
二、深拷贝:
深拷贝是指 源对象与拷贝对象互相独立 ,其中任何一个对象的改动都不会对另外一个对象造成影响。
举个例子,一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人,叫李四,不管是张三中了一百万还是李四中了一百万都不会影响另外一个人。
比较典型的就是Value(值)对象,如预定义类型Int32,Double,以及结构(struct),枚举(Enum)等。
深拷贝就是当拷贝对象中有对其他资源(如堆、文件、系统等)的引用时(引用可以是指针或引用)时,对象的另开辟一块新的资源,而不再对拷贝对象中有对其他资源的引用的指针或引用进行单纯的赋值。如:
#include <iostream>
using namespace std;
class Str
{
public:
//假如其中有一段动态分配的内存
Str(int _size) : size(_size)
{
data = new int[size];
}
int GetStr()
{
return *data;
}
int *GetStr_add()
{
return data;
}
Str()
{
}
//深拷贝
Str(const Str &_Str) : size(_Str.size)
{
data = new int[size];
}
//析构时释放资源
~Str()
{
delete[] data; data = NULL;
}
private:
int *data;
int size;
};
void test()
{
Str s1(5);
Str s2(s1);
cout << s2.GetStr() << endl;
}
int main()
{
test();
return 0;
}
三、总结:
深拷贝和浅拷贝的区别是在对象状态中包含其它对象的引用的时候,当拷贝一个对象时,如果需要拷贝这个对象引用的对象,则是深拷贝,否则是浅拷贝。