传智教育院校邦
全面服务、资源分享、学习交流
初学C++时,深拷贝与浅拷贝绝对是一个理解上的麻花团,鉴于很多老师跟自由互联小编反馈,在教学过程中很多学生经常混淆这两个概念。今天呢,自由互联小编就专门写一写C++中的深拷贝与浅拷贝,便于老师们跟学生举例讲解。
1
浅拷贝
首先我们来看一下浅拷贝,所谓浅拷贝呢,顾名思义就是拷贝的比较浅,这个“浅”字怎么理解呢,下面先举个“栗子”。
比如,一户人家有两个儿子,两个儿子要结婚,那首先呢大儿子先结婚,结婚先得买房子呀,那买了房子给大儿子成了家,接着就是小儿子结婚,小儿子结婚,一应规格按照大儿子操办,但是问题来了,没钱买第二套房子,就让小儿子与大儿子共用一套房子,那这到最后必须要干仗呀。
这个呢,就是典型的浅拷贝,一应规格按照别人的拷贝,但不能占人家东西呀。
有这个例子,这浅拷贝呢就好理解了,来一个“官腔”说法就是,当一个类中有指针类型的数据,浅拷贝呢就是将新对象(比如小儿子)指向原有对象(比如大儿子)的内存空间(就是房子),并没有为新对象的指针成员分配新空间(不给买房),这就是浅拷贝。
下面上代码(先给大儿子买房结婚)。
#define _CRT_SECURE_NO_WARNINGS#include
给大儿子买房结婚,完全没有问题,不信看运行结果。
好了,现在问题来了,小儿子也要结婚,并且结婚规格按照大儿子操办,要拷贝人家。在Son类中新增一个拷贝构造函数。
Son(const Son //拷贝构造函数
在类外实现这个拷贝构造函数。
Son::Son(const Son _name = another._name; //登记姓名(冒充大儿子) _house = another._house; //直接把大儿子房子给小儿子}
(左右滑动即可查看完整代码)
在main()函数中追加如下代码。
Son son2(son1); //直接按大儿子规格操办婚事(房子也用人家的)cout <<"son2:(小儿子也要显摆房子,看能不能显摆成)";son2.show();
(左右滑动即可查看完整代码)
这个时候就开始干仗了,拿别人的房子当自己的房子,按自己的风格再装修一遍(数据拷贝),这搁谁谁愿意。再次运行程序,程序就报异常了。
这就是浅拷贝,拷贝别人,却没有拷贝到精髓。
2
深拷贝
看完浅拷贝,那深拷贝就不难理解了,深拷贝就是给两个儿子一人买一套房子,互相独立,谁也不跟谁干仗。翻译成官方的说法就是,深拷贝就是在拷贝构造函数中完成更深层次的拷贝,当类中有指针成员时,深拷贝可以为新对象(小儿子)的指针分配一块内存空间(买房子),将数据复制到新空间(装修房子)。
要实现深拷贝就得修改拷贝构造函数,将上面拷贝构造函数修改一下,修改之后的代码如下所示。
Son::Son(const Son _name = another._name; //登记姓名(冒充大儿子) //_house = another._house; //直接把大儿子房子给小儿子 int len = strlen(another._house) + 1; //统计一下大儿子房子大小 _house = new char[len]; //给小儿子买一套同样大小的房子 strcpy(_house, another._house); //装修}
(左右滑动即可查看完整代码)
这样再运行程序,就不会报异常了。因为两个对象(两个儿子)各有独立空间(房子),就不报异常了。
总的一句话,深拷贝与浅拷贝的区别就是,深拷贝可以按照已有对象的规格为新对象分配独立的内存空间,而浅拷贝呢,只是完成了指针的拷贝,新对象与已有的对象共有一块内存空间。
当类中没有指针类型的成员变量时,浅拷贝就可以解决所有拷贝问题,但当类中有指针类型的成员变量时,要执行拷贝操作时,必须使用深拷贝。
END
独家文章推荐(点击文字即可查看):
【文章转自防cc http://www.558idc.com/gfcdn.html 复制请保留原URL】