C++ 深拷贝 与 浅拷贝

本文详细阐述了深拷贝与浅拷贝的概念及其应用场景。首先介绍了类对象复制的三种常见情况,并深入探讨了深拷贝产生的原因及其实现方法。最后,通过实例说明了如何自定义拷贝函数来实现深拷贝。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【摘要】
    本文分三部分阐释深拷贝于浅拷贝,着眼点主要还是在深拷贝。第一部分讲述为什么会有拷贝,即对象之间的复制。第二部分讲述为什么会有深拷贝于浅拷贝,即类成员存在资源分配。第三部分阐释深拷贝于浅拷贝的定义与使用方式,即是否自定义拷贝函数。	

【正文】
	对于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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值