c++的浅拷贝和深拷贝

C++(c plus plus)是一种计算机高级程序设计语言,由C语言扩展升级而产生。区别于c的最大不同就是引入了【类】这一抽象概念。通过【类】创建的每一个【对象】在被创建的时候会执行【构造函数】,且一般情况下构造函数的作用都是给对象的成员变量进行初始化赋值。

 

如图所示,先定义出一个名为“Code”的类,在这个类里面有一个private权限的int*成员变量p、构造函数Code()、修改*p数值的SetCode()、输出p的地址、p指向空间的地址和p指向空间中的数值的Show()和析构函数~Code()。

在主函数中我们定义两个对象,分别叫alpha1和bravo2。

如果我们将bravo2的部分注释掉并更改alpha1的*p,可以看到两次输出的*p是不一样的,说明SetCode()成功修改了*p。

假设我们想要将bravo2的值设定为和alpha1一样,我们只需要将alpha1=bravo2即可,随后通过调用Show函数来输出检验bravo2的值。

但实际情况却如下所示,代码运行时会出现错误。

如果我们在“return 0;”处设下断点,观察局部变量的变化过程。

此时二者的数值和地址均相同。

执行一次析构函数后,由于alpha1和bravo2二者存储在栈区中,根据“FILO”原则,bravo2的数据空间率先被析构函数释放,而此时alpha1的地址和数值也发生了变化,一样会被释放掉。

倘若继续进行断点调试,则会出现以上错误——二次释放地址空间

由于alpha1和bravo2二者所指向的地址是相同的,当对二者中的任何一个的地址进行操作时,二者的地址会被同时改变,这就是所说的,浅拷贝。

因此,倘若我们操作创建的类对象,就要想办法使它们的地址空间相互独立。

解决的办法就是:先给目标对象成员指针变量开辟一块空间,将源对象指针成员指向空间的值赋给开辟好的空间,即深拷贝。

 同刚才的做法,我们需要将拷贝构造函数修改一下,向函数中传入一个Code类对象的引用,在函数体内通过this指针为每个创建的对象单独开辟空间并赋值。

输出结果也和我们预想的一样。

 

 此时如果再次在“return 0;”处设下断点,观察局部变量的变化过程,则会得到如下结果。

按照Charlie3、bravo2、alpha1的顺序依次被释放。

综上所述:深浅拷贝具有明显的区别。

深拷贝在创建目标对象时为其开辟独立空间,之后的所有对原对象和目标对象的操作都是对二者的独立操作;浅拷贝则是在创建目标对象时使用原对象的空间创建目标对象,之后的操作可能对二者同时造成影响。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值