C++的深拷贝与浅拷贝(附简单图例)#C++

原先对深拷贝浅拷贝迷迷糊糊,不太懂析构函数的作用,最近学的一个实例分享给大家,帮助理解~

两个疑问:1、析构函数的作用是什么?

                   2、深拷贝和浅拷贝有什么区别?它们二者有啥作用?

运行结果分析如下:首先调用有参构造函数,创建p1,然后输出年龄。再通过Person p2 = Person(p1); 调用拷贝构造函数创建出p2。2次析构对应着原先2次构造。

运行结果上看好像还行,但实际上面的代码有些问题。

在第15行中      m_height =new int(height);    这是通过new创建的一块在堆上的空间,需程序员手动delete释放,但是在程序运行结束后缺没有被释放掉。

测试如下: 

我们在第3行加一个全局变量指针mark,并且将mark =m_height 。

最后结果也证明事实上并没有释放掉new出来的空间。所以这时候析构函数的作用便出来了,我们需要自己写一个析构函数来释放掉我们人为new出来的堆上的一个空间。

更新之后的析构函数:

看起来好像没有问题,但是运行起来却发现出错了。

出错的原因就在这下图的的第33行代码:

本文的核心来了:接下来我通过绘图软件解释:

这时候根据原则:先构造的后析构,也就是说先构造p1,再构造p2。析构便是反过来,先析构p2,后析构p1,而析构p2的时候,会调用析构函数,这时候便通过delete操作将原先在创建p1时候new的空间给释放了,这时候结束p2析构。到了要开始准备析构p1时候,却发现指针指向的空间已经被释放了。

这也就是回答了:浅拷贝实际上只是赋值操作,p1,p2中的指针指向的还是同一块空间。产生出错的原因便是:同一空间被释放两次。那么解决的办法便是:深拷贝!

所谓深拷贝就是  既然要拷贝咱们就贯彻到底。 p2也模仿p1,自己new一块堆中的空间。

代码更改如下:

创作不易!真正能理解的话给个点赞o( ̄▽ ̄)d

设计并实现一个动态整型数组类Vect,要求: (1)实现构造函数重载,可以根据指定的元素个数动态创建初始值为0的整型数组,或根据指定的内置整型数组动态创建整型数组。 (2)设计拷贝构造函数和析构函数,注意使用深拷贝。 (3)设计存取指定位置的数组元素的公有成员函数,并进行下标越界,若越界则输出“out of boundary”。 (4)设计获取数组元素个数的公有成员函数。 (5)设计用于输出数组元素的公有成员函数,元素之间以空格分隔,最后以换行符结束。 在main函数中按以下顺序操作: (1)根据内置的静态整型数组{1,2,3,4,5}构造数组对象v1,根据输入的整型数构造数组对象v2。 (2)调用Vect的成员函数依次输出v1和v2的所有元素。 (3)输入指定的下标及对应的整型数,设置数组对象v1的指定元素。 (4)根据数组对象v1拷贝构造数组对象v3。 (5)调用Vect的成员函数依次输出v1和v3的所有元素。 设计并实现一个动态整型数组类Vect,要求: (1)实现构造函数重载,可以根据指定的元素个数动态创建初始值为0的整型数组,或根据指定的内置整型数组动态创建整型数组。 (2)设计拷贝构造函数和析构函数,注意使用深拷贝。 (3)设计存取指定位置的数组元素的公有成员函数,并进行下标越界,若越界则输出“out of boundary”。 (4)设计获取数组元素个数的公有成员函数。 (5)设计用于输出数组元素的公有成员函数,元素之间以空格分隔,最后以换行符结束。 在main函数中按以下顺序操作: (1)根据内置的静态整型数组{1,2,3,4,5}构造数组对象v1,根据输入的整型数构造数组对象v2。 (2)调用Vect的成员函数依次输出v1和v2的所有元素。 (3)输入指定的下标及对应的整型数,设置数组对象v1的指定元素。 (4)根据数组对象v1拷贝构造数组对象v3。 (5)调用Vect的成员函数依次输出v1和v3的所有元素。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值