在看《深入探索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++模型》的笔记中有记载,这里直接上图:


总结:

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

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

[C++]bitwise和memberwise的区别的更多相关文章

  1. 编译器角度看C++复制构造函数

    [C++对象模型]复制构造函数的建构操作 关于复制构造函数的简单介绍,可以看我以前写过的一篇文章C++复制控制之复制构造函数该文章中介绍了复制构造函数的定义.调用时机.也对编译器合成的复制构造函数行为 ...

  2. JS魔法堂:再识Bitwise Operation & Bitwise Shift

    Brief linkFly的<JavaScript-如果...没有方法>中提及如何手写Math.round方法,各种奇技淫招看着十分过瘾,最让我惊叹的是 ~~(x + )) ,完全通过加法 ...

  3. vb.net 与 c# 运算符区别

    vb.net vs c# 详细的Operators运算符区别 vb.net ===================== Comparison = < > <= >= <& ...

  4. &与&&,|与||的区别

    今天在做leetcode的时候,遇到了运算符的不同而导致结果不一致的问题.记录一下提醒自己 中文名称与英文名称 &:按位与(Bitwise and) &&:逻辑与(logica ...

  5. c#与java的区别

    经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...

  6. jquery和Js的区别和基础操作

    jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...

  7. 【原】nodejs全局安装和本地安装的区别

    来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...

  8. 探究@property申明对象属性时copy与strong的区别

    一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...

  9. X86和X86_64和X64有什么区别?

    x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...

  10. Java中Comparable与Comparator的区别

    相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...

随机推荐

  1. cURL error 1014: SSL verify failed 报错

    报错 [ERROR] cURL error 1014: SSL verify failed (see https://curl.haxx.se/libcurl/c/libcurl-errors.htm ...

  2. Unexpected token u in JSON at position 0

    文章目录 1.1 错误原因: 1.2 解决思路: 1.1 错误原因: 因为JSON.parse()不能解析字符串中的undefined 出错的结果:某一行的这个字段的值为空,就会报错,整个表格都显示不 ...

  3. AI人脸识别+换脸

    视频换脸可参考 https://github.com/iperov/DeepFaceLab import dlib.dlib as dlib import numpy import sys impor ...

  4. C#中下载项目中的文件

    1.将需要下载的文档添加到项目的文件夹中 2.接口部分 public IActionResult DownLoad() { var filePath = Directory.GetCurrentDir ...

  5. 八、docker compose容器编排

    一. Docker-Compose 1.1. 什么是Docker Compose Compose 项目是 Docker 官方的开源项目,负责实现 Docker 容器集群的快速编排,开源代码在 http ...

  6. GNN 101

    GNN 101 姚伟峰 http://www.cnblogs.com/Matrix_Yao/ GNN 101 Why Graph无处不在 Graph Intelligence helps It's t ...

  7. 「浙江理工大学ACM入队200题系列」问题 H: 零基础学C/C++18——三位数反转

    本题是浙江理工大学ACM入队200题第二套中的H题 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习惯,尤其是要利用好输入和输出样例. ...

  8. LoadRunner11脚本关联+运行负载+分析结果

    一.脚本创建关联和插入检查点 脚本录制完成后,首先需运行脚本回放,验证是否可回放成功,然后找出各事务请求中的关联点! 如本例子中,录制的场景为:打开综合窗口收件-->查询事项-->窗口登记 ...

  9. AR空间音频能力,打造沉浸式声音体验

    随着元宇宙的兴起,3D虚拟现实广泛引用,让数字化信息和现实世界融合,目前大家的目光主要聚焦于视觉交互层面,为了在虚拟环境中更好的再现真实世界的三维空间体验,引入听觉层面必不可少,空间音频孕育而生. 空 ...

  10. 嵌入式-C语言基础:通过结构体指针访问结构体数组

    #include<stdio.h> #include<string.h> struct Student { char name[32]; int age; int height ...