浅拷贝,拿人手短

深拷贝和浅拷贝的主要区别为是否只拷贝了指针的值,还是说拷贝对象有在堆区另外开辟一块内存空间。
这里我们先举个栗子:
政府规定每一个人(Person)生下来都会给他分配一块地皮子(Houre),然后把这块地皮子的编号(hourseid)给他,表示他是这块地的主人(开局一块地,装备全靠捡!)人死之后,这块地就要被国家收走了,后面的人也要分嘛,资源可持续利用。

class Hourse
{int size;bool exitYangtai;//这个房子可能有很多特征,比如说面积多大啊,有没有阳台啊等等
};
class Person
{string name;Hourse * hourseid;
public:Person(string name){//这个人啊生下来我们就给他一把钥匙,钥匙指向移动房子this->name = name;this->hourseid = new Hourse;}~Person(){//这个人时候,房子也要收归国有了delete this->hourseid;this->hourseid = nullptr;cout << "析构函数调用"<< endl;}
};

这个时候加入我们希望采用克隆人的方式是生产一个人,那我们思考一下,应该怎样克隆呢?有这样一种方式:
1、克隆人与原宿主的名字一样
2、克隆人与原宿主的房产证一样
对应代码:

Person(const Person & p){this->name = p.name;this->hourseid = p.hourseid;}

这是最简单的克隆方式,对于值类型和指针类型都是值拷贝。那我们试着用这种方式克隆一下人:
我们先生一个叫做“Tom”的人,然后用Tom去克隆一个人,并且将两个人都作为局部函数的变量,在局部函数结束的时候,这两个变量就会被系统杀死拉:

void test01()
{Person p1("tom");Person p2 = p1;
}

在主函数里面调用测试案列:
会发现系统报错:

这是什么原因呢?
原来,p2中的所有的属性,包括房产证编号和姓名都是通过值拷贝的方式从p1拷贝过来的,也就是说,他们两分配的是同一处的房产;当两个人都要快去世的时候,系统会先回收p2的房产,(哎,回收成功),接着回收P1的房产,这是管理员发现,P1你根本就没有房产啊。于是系统就报错了!

解决方法

毫无疑问,最好的解决方法就是,即使是在克隆人的时候啊,你也给这个人重新分块地,让被克隆对象也有自己的房产证。用专业术语的话就是,在拷贝构造的同时,并不是对指针进行简单的值拷贝,而是在内存新开辟一块空间,赋予被拷贝对象同等类型的指针并指向新开的空间。这个就是深拷贝。

Person(const Person & p){this->name = p.name;this->hourseid = new Hourse;}

在实际上的开发中,我们尽量使用深拷贝。

关于深拷贝和浅拷贝的一些思考相关推荐

  1. python怎么避免浅拷贝_详谈Python中的深拷贝和浅拷贝

    在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用.为了生成这个副本,就产生了拷贝. ...

  2. python怎么避免浅拷贝_深度解读Python深拷贝与浅拷贝问题

    Illustrations by Leon Tukker ♚ 作者:PayneLi,Python全家桶,主要讲述数据挖掘.机器学习和深度学习领域的前沿技术,同时还会推荐一些行业最新论文.技术专家的经验 ...

  3. 深拷贝与浅拷贝、值语义与引用语义对象语义 ——以C++和Python为例

    深拷贝与浅拷贝.值语义与引用语义/对象语义 --以C++和Python为例 值语义与引用语义(对象语义) 本小节参考自:https://www.cnblogs.com/Solstice/archive ...

  4. 【Python】直接赋值,深拷贝和浅拷贝

    直接赋值: 对象的引用,也就是给对象起别名 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加 ...

  5. 深拷贝与浅拷贝是什么?如何实现浅拷贝和深拷贝?

    基于对什么是深拷贝?什么是浅拷贝?如何实现一个深拷贝和浅拷贝?为什么要用到深拷贝?的思考,总结如下,如有不足之处希望多多指教. 什么是浅拷贝? 浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用. A是 ...

  6. 【Java基础系列教程】第八章 Java面向对象详解(三)_抽象类、接口、内部类、深拷贝与浅拷贝

    一.JavaBean规范 1.1 什么是JavaBean JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中.特点是可序列化,提供无参构造器,提供getter方法和 ...

  7. java 反射 深拷贝_Java深拷贝和浅拷贝(深克隆和浅克隆)

    Java中创建对象有两种方式: 通过new操作符创建一个对象 通过clone方法来复制一个对象 使用反序列化来创建一个对象 通过使用Class类的newInstance方法来创建一个对象 使用Cons ...

  8. python粘性拓展_Python 拓展之详解深拷贝和浅拷贝

    写在之前 在昨天的文章里 (零基础学习 Python 之字典),写字典的方法的时候留了一个小尾巴,那就是 copy() 方法还没讲.一是因为 copy 这个方法比较特殊,不单单是它表面的意思:二是以为 ...

  9. 一文了解Python深拷贝与浅拷贝问题

    https://www.toutiao.com/a6661446735224635907/ 在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就 ...

最新文章

  1. 全球十大AI训练芯片大盘点:华为昇腾910是中国唯一入选
  2. 推荐一款IDE开发工具插件GitToolBox
  3. Android ActionBar随ScorllView上下拖动而透明度渐变效果
  4. HTML5 新元素标签系列:最简版 HTML5
  5. windows之间自动传送文件
  6. 自学python单片机编程-Python玩转单片机:从基础到进阶,几款主流的开发板大盘点!...
  7. SFP光模块与SFP+、XFP、QSFP、GBIC、BIDI的区别
  8. BlockingQueue的核心方法
  9. expert php and mysql_Expert PHP and Mysql
  10. 台媒体:IBM PC将成特洛伊木马【ZZ】【另一个角度】
  11. 【边喝caffee边Caffe 】(三) Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type
  12. AVR单片机项目教程 基于C语言,AVR单片机项目教程:基于C语言(第2版)
  13. MATLAB调用电脑摄像头前安装图像采集工具箱硬件支持包
  14. 云计算安全知识CCSK V4 知多少
  15. android q mix3,Android Q+5G 小米MIX3现场播放8K视频
  16. 什么是一对一电脑无人直播?
  17. 微信小程序 —— 考勤管理Demo(前后端及数据库)
  18. ICPC 山东省省赛刷题 第十一届山东省大学生程序设计竞赛 ACM省赛 牛客 DGHM题
  19. 使用 Java 解决现代应用程序开发挑战
  20. 腾讯财报:2018年Q3腾讯净利润197.1亿元 同比增长15%

热门文章

  1. 以太网适配器的驱动程序可能出现问题
  2. HCNR200/201线性光耦隔离检测电压电路
  3. 解决Xposed提示java.lang.ClassNotFoundException: Didn't find class com.xposeddemo.xposed.XposedInit
  4. “该文件没有与之关联的程序来执行该操作。请安装应用,若已经安装应用,请在“默认应用设置”页面中创建关联。
  5. 0909期即将上市:游戏引擎启示录
  6. Lenovo MORFFHL鼠标对码教程
  7. Kruskal(克鲁斯卡尔)——图论(C++)
  8. RIQ编号,冲突处理
  9. 会议室电脑怎么无线投屏
  10. JAVA Socket详解