深拷贝与浅拷贝

来源:互联网 发布:淘宝上的手办是真假 编辑:程序博客网 时间:2024/06/06 22:47

通俗来说

深拷贝是源对象与拷贝对象相互独,任何一个对象的更改都不会影响另外的对象..

浅拷贝是源对象与拷贝对象拥有同一个实体,仅仅是名称不同,其中任何一个更改都会影响对方


一,常见的深拷贝

我们就平常用的简单的复制操作即为深拷贝,例如

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


更改dest.X的值不影响source.X的值,source.X还是10

二,浅拷贝

对于类来说, 同一个类的不同对象之间的赋值时浅拷贝,如下

  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


注意上述复制过程中会调用拷贝构造函数,复制构造函数也是构造函数,但它只有一个参数,这个参数是本类的对象,而且采用对象的引用形式,一般约定加const声明,使参数值不能更改,以免在调用函数时不慎将对象修改。此复制构造函数的作用就是将实参对象的各数据成员的值一一赋给新对象中成员的值。


参考博客

http://www.cnblogs.com/phoenix-rock/archive/2006/11/07/shallowcopy_deepcopy.html

http://blog.csdn.net/qsyzb/article/details/11267739




0 0
原创粉丝点击