在看《深入探索C++对象模型》这本书的时候,我看见了bitwise senimatics和memberwise senimatics,看的时候还不清楚这两个是什么意思,书本上直接使用的是英文,所以我的直译就是位逐次语意和成员逐次语意,经过一番百度后才发现原来就是简单的浅拷贝和深拷贝的区别,既然自己已经百度了,不妨就顺便把这两者给做个简单的分析吧。


进入正题:

在探索C++模型书上提到的,如果该object存在class member objects的话,那么如果展现出bitwise,就不会调用该成员对象的constructor,这很显然不是我们想看到的。比如:

class Mydata

parent* myparent;//子对象
string myName;
int age;
char sex;
} Mydata lizhenghao;
Mydata zhangsan;
zhangsan=lizhenghao;

我们来假设出两种情况:

1.如果这里采用的是浅拷贝的话,lizhenghao的所有数据都会被拷贝到zhangsan中,而zhangsan中的myparent指针也会指向lizhenghao的myparent成员对象的内存地址中去。

2.如果采用的是深拷贝的话,zhangsan中的myparent子对象会调用该对象的构造器,拷贝一份内存数据,这时候两个人在内存并不是共享一份数据的,而是两份!

而上面的代码中到底会是情况1还是情况2呢?实际上因为在例子中,我并没有手写一个copy constructor,所以编译器为我们合成的default copy constructor是不会使用深拷贝的,结果是1.

但是我们还是要知道,什么时候编译器为我们合成的default constructor会以memberwise拷贝而不是bitwise拷贝呢?在我的《深度探索C++模型》的笔记中有记载,这里直接上图:


总结:

浅拷贝:不拷贝内存数据,不会调用成员对象的构造器。

深拷贝:会拷贝内存数据,调用成员对象的构造器。

最新文章

  1. 搞定.NET MVC IOC控制反转,依赖注入
  2. UE4 中Struct Emum 类型的定义方式 笔记
  3. CentOS6.5上Oracle11gR2静默安装
  4. Map的基本用法(Java)
  5. 使用Redis来实现LBS的应用
  6. HttpClient -- 血的教训
  7. Classifier4J的中文支持
  8. Whitespace character
  9. ASP.NET MVC 实现与SQLSERVER的依赖缓存
  10. Java利用Rxtx进行串口通讯
  11. linux下实现rm()函数删除文件或目录
  12. redis34--string 操作
  13. window2008 64位系统无法调用Microsoft.Office.Interop组件进行文件另存的解决办法
  14. 运维必备:Oracle自备份精简教程(linux及win)
  15. SpringAOP简单入门
  16. 解决win10 VC++6.0 应用程序无法正常运行 0xc0000142
  17. JAVA通过http访问其他服务端API
  18. BZOJ3876 AHOI/JSOI2014支线剧情(上下界网络流)
  19. x1c2017 8G版 win linux的取舍纠结记录
  20. sourceforge

热门文章

  1. git-secret:在 Git 存储库中加密和存储密钥(下)
  2. python实现多接口翻译软件
  3. 小米MIUI禁止系统更新
  4. 14.api根路由
  5. 【pytest官方文档】解读- 开发可pip安装的第三方插件
  6. DQL语句
  7. Sql Server性能排查和优化懒人攻略
  8. 网络协议之:redis protocol 详解
  9. Python 学习思路 思维导图 Xmind
  10. 真正“搞”懂HTTP协议04之搞起来