深拷贝和浅拷贝的示意图大致如下:
1.浅拷贝:
浅拷贝只复制指向某个对象的指针,源对象与拷贝对象共用一份实体(内存段),仅仅是引用的变量不同(名称不同),而不复制对象实体本身,新旧对象还是共享同一块内存。简而言之,浅拷贝可以拷贝这个对象的变量,但是不能拷贝这个对象所引用的对象。
浅拷贝就像一个队伍(疾风队)五个人,他们又新建了一个队伍叫德玛西亚队,里面的五个成员名(位置:上单、中单、下单、辅助、打野)也拷贝过去了,但是每个位置的成员还是疾风队的那五个人,并没有招来新人加入。
2.深拷贝:
深拷贝会另外创造一个一模一样的对象,重新申请了一段内存并把对象拷贝到新的内存段,源对象与拷贝对象互相独立。比较典型的例子就是Value(值)对象,即变量,如int、double、结构体、枚举等等。
深拷贝就像克隆技术一样,使用张三基因克隆了一个和张三一模一样的人,取名李四,后期李四不管是缺胳膊少腿了,和原来的张三都没有任何关系。
关于浅拷贝深拷贝的好文(C++类为介绍):https://blog.csdn.net/qq_41929943/article/details/102511696
3.隐式共享:
隐式共享又叫做回写复制。当两个对象共享同一份数据时(通过浅拷贝实现数据块的共享),如果数据不改变,不进行数据的复制。而当某个对象需要改变数据时则执行深拷贝。
隐式共享实例:QString基于隐式共享实现,详细链接:https://www.icode9.com/content-4-646552.html
4、引用拷贝
二者的引用是同一个对象,并没有创建出一个新的对象,因为是同一个对象的引用,所以两者改一个,另一个对象的值也随之改变。
4、赋值和浅拷贝的区别
当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。
浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。