【摘要】
本文分三部分阐释深拷贝于浅拷贝,着眼点主要还是在深拷贝。第一部分讲述为什么会有拷贝,即对象之间的复制。第二部分讲述为什么会有深拷贝于浅拷贝,即类成员存在资源分配。第三部分阐释深拷贝于浅拷贝的定义与使用方式,即是否自定义拷贝函数。
【正文】
对于C++而言,在程序员进行类定义的时候,系统会自动生成四个函数,即,构造函数、析构函数、拷贝函数和赋值函数。这一点在 String 类的身上有很明显体现。这篇文章将要讲述的是拷贝函数中存在的一个小的知识点,深拷贝于浅拷贝。
众所周知,类对象是通过拷贝函数来实现类对象之间的拷贝的,那么,第一步先来讨论下,有哪些情况存在类对象之间的拷贝。
存在类对象拷贝的三种情况 1. 用已有对象初始化新对象
例: Myclass Obj_A(Obj_B);
2. 调用输入参数为类对象的函数
例:Myclass func_A(Obj_A);
3. 调用返回值为类对象的函数
例:Myclass B = func_B();
此时函数的返回值为类对象,为给新的对象 B 赋值,此时,系统会临时复制出一个对象。
如果只存在简单复制,诸如,整数赋给整数我们肯定就不会讨论这么琐碎的深拷贝于浅拷贝问题了。那么,现在就来说说,为什么会有深拷贝和浅拷贝的提出。
深拷贝的原因 类对象间复制,因类成员存在资源(动态内存,堆)申请的情况,而产生因复制出现的混乱。
例·:原有对象 a 的成员存在动态内存申请,将对象 a 复制给对象 b ,b 获得的是 a 开辟的内存空间地址,若类未自定义拷贝(复制)函数,系统自行处理使得该内存空间的隶属权产生混乱。一旦析构,该空间将面临两次内存释放的情况,出现运行错误。
为解决上述问题,C++有了深拷贝于浅拷贝的概念,那么现在来谈谈什么是深拷贝什么是浅拷贝。
深拷贝于浅拷贝的定义
深拷贝可以理解为类拥有资源(堆,动态内存或其它系统资源),当类对象发生复制时,申请资源重建的情况称之为深拷贝,申请资源未重建的情况称之为浅拷贝。
最后来谈谈怎么实现深拷贝于浅拷贝,浅拷贝其实直接使用系统自行定义的拷贝构造函数即可,现在主要说说深拷贝怎么做。
深拷贝的实现方式:
自定义拷贝函数,对待“赋值”对象进行动态内存之类的操作机制,输入参数一定是 引用。
例:Myclass(Myclass &srs);