通俗来说
深拷贝是源对象与拷贝对象相互独,任何一个对象的更改都不会影响另外的对象..
浅拷贝是源对象与拷贝对象拥有同一个实体,仅仅是名称不同,其中任何一个更改都会影响对方
一,常见的深拷贝
我们就平常用的简单的复制操作即为深拷贝,例如
int a = 2;
int b = a;
b = 1;
上述即为深拷贝,改变b的值并不影响a的值
类似的还有结构体的对象之间的赋值
例如
struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
Point source = new Point(10, 20);
Point dest = source;
dest.X = 20
二,浅拷贝
对于类来说, 同一个类的不同对象之间的赋值时浅拷贝,如下
class Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
Point source = new Point(10, 20);
Point dest = source;
dest.X = 20;
dest.X = 20 执行的是浅拷贝,此时 source.X = 20
由于引用对象的赋值仅仅是复制变量指向的地址,因此要对引用对象进行深拷贝就要重新创建一份该对象的实例,并对该对象的字段进行逐一赋值,如以下写法
class Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
Point source = new Point(10, 20);
Point dest = new Point(source.X, source.Y);
//或以下写法
//Point dest = new Point()
//dest.X = source.X
//dest.Y = source.Y
赋值与复制的区别
对象的赋值是对一个已经存在的对象赋值,因此必须先定义被赋值的对象,才能进行复制。
对象的复制是从无到有建立一个新对象,并使它与一个已有的对象完全相同(包括对象的结构和成员的值)
//赋值
//对象1和对象2属于同一个类
对象1 = 对象2
//复制
//对象2是已存在的对象
类 对象1( 对象2)
//两外一种复制形式
类 对象1 = 对象2
参考博客
http://www.cnblogs.com/phoenix-rock/archive/2006/11/07/shallowcopy_deepcopy.html
http://blog.csdn.net/qsyzb/article/details/11267739