浅拷贝就是在类是以复制方式创建对象的时候,或者在变量进行复制的时候,没有设置自定义的拷贝构造函数或重载等号运算符的拷贝函数,导致对变量中的所有进行拷贝,包括指针,即指针只拷贝地址,不会再为指针变量申请内存。

代码如下:
#include<stdio.h> class test { public: int num; int *point; }; int main() {
test t1; t1.point=new int; scanf("%d",&t1.num); test t2=t1; printf("%d %d %p
%p\n",t1.num,t2.num,t1.point,t2.point); t2=t1; printf("%d %d %p
%p\n",t1.num,t2.num,t1.point,t2.point); return 0; }
结果如下:



即两个指针指向了相同的地址,那这样有什么问题呢?别忘了,我们还没有设置析构函数。
#include<stdio.h> class test { public: int num; int *point; ~test() { delete
point; } }; int main() { test t1; t1.point=new int; scanf("%d",&t1.num); test
t2=t1; printf("%d %d %p %p\n",t1.num,t2.num,t1.point,t2.point); t2=t1;
printf("%d %d %p %p\n",t1.num,t2.num,t1.point,t2.point); return 0; }
我们加上析构函数来运行一下:




看到了吧,因为我们对同一块内存进行了两次析构,导致程序崩掉,而且,浅拷贝的另一个问题是我们在修改一个变量的时候,另一个变量会受到影响,这样耦合性很大的程序我们还是能避免尽量避免的好。所以怎样才能避免浅拷贝呢,就是使用深拷贝。我们为类实现自己的拷贝构造函数。

像这样:
#include<stdio.h> class test { public: int num; int *point; test() {}
test(test &tmp) { point = new int; *point = *tmp.point; } ~test() { delete
point; } }; int main() { test t1; t1.point=new int; scanf("%d",&t1.num); test
t2=t1; printf("%d %d %p %p\n",t1.num,t2.num,t1.point,t2.point); return 0; }
结果就是这样:



深拷贝两个指针使用了不同的内存。


但是深拷贝的代码中我为什么没有重载等号运算符呢?因为我不知道怎么判断一个类的指针成员变量是否申请了内存。他没申请的话,因为还没有发生复制,所以是野指针。申请了内存后,他便指向了那块内存,但是我实在是想不出来怎么判断是否已经申请了内存,所以我没有办法写重载等号函数。如果你找到了解决办法的话,还请您能留个言或邮箱告诉我一下,感谢。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信