[C++]bitwise和memberwise的区别
在看《深入探索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++模型》的笔记中有记载,这里直接上图:
总结:
浅拷贝:不拷贝内存数据,不会调用成员对象的构造器。
深拷贝:会拷贝内存数据,调用成员对象的构造器。
最新文章
- 搞定.NET MVC IOC控制反转,依赖注入
- UE4 中Struct Emum 类型的定义方式 笔记
- CentOS6.5上Oracle11gR2静默安装
- Map的基本用法(Java)
- 使用Redis来实现LBS的应用
- HttpClient -- 血的教训
- Classifier4J的中文支持
- Whitespace character
- ASP.NET MVC 实现与SQLSERVER的依赖缓存
- Java利用Rxtx进行串口通讯
- linux下实现rm()函数删除文件或目录
- redis34--string 操作
- window2008 64位系统无法调用Microsoft.Office.Interop组件进行文件另存的解决办法
- 运维必备:Oracle自备份精简教程(linux及win)
- SpringAOP简单入门
- 解决win10 VC++6.0 应用程序无法正常运行 0xc0000142
- JAVA通过http访问其他服务端API
- BZOJ3876 AHOI/JSOI2014支线剧情(上下界网络流)
- x1c2017 8G版 win linux的取舍纠结记录
- sourceforge