首页 > 其他分享 >The Semantics of Constructors——2.2 拷贝构造函数的构造操作

The Semantics of Constructors——2.2 拷贝构造函数的构造操作

时间:2023-02-07 00:45:05浏览次数:79  
标签:object Constructors 基类 2.2 拷贝 copy class 构造函数

The Semantics of Constructors

2.2.1 Default Memberwise Initialization(默认的逐成员初始化)

如果class没有提供一个explicit copy constructor又当如何?当class object 以“相同 class 的另一个 object”作为初值,其内部是以所谓的 default memberwise initialization手法完成的,也就是把每一个内建的或派生的data member(例如一个指针或一个数组)的值,从某个object拷贝一份到另一个object身上。不过它并不会拷贝其中的 member class object,而是以递归的方式施行 memberwise initialization。

copy constructors在必要的时候才由编译器产生出来。这个句子中的“必要”意指当 class 不展现 bitwise copy semantics 时。

2.2.2 什么时候不会Bitwise Copy Semantics(位逐次拷贝)?

(什么时候编译器会合成copy constructors呢?)

什么时候一个class不展现出“bitwise copy semantics”呢?有4种情况:

  1. 当class内含一个member object 而后者的class声明有一个copy constructor时(不论是被 class设计者显式地声明,就像前面的 String那样;或是被编译器合成,像 class Word那样)。

  2. 当 class继承自一个 base class而后者存在一个 copy constructor时(再次强调,不论是被显式声明或是被合成而得)。

  3. 当 class声明了一个或多个 virtual functions时。

  4. 当 class派生自一个继承串链,其中有一个或多个 virtual base classes时。

在前两种情况中,编译器必须将member或base class的“copy constructors调用操作”安插到被合成的copy constructor 中。

2.2.3 重新设定 Virtual Table的指针

1. 同类型之间的拷贝

//Bear有虚函数
Bear yogi;
Bear winnie  = yogi;

会直接把yogi的vptr值拷贝给winnie,两个对象的虚函数指针指向相同的虚函数表。

2. 用派生类初始化基类


//ZooAnimal 是Bear的基类
ZooAnimal franny = yogi; //会发生sliced

合成出来的ZooAnimal copy constructor 会显式设定object的vptr指向ZooAnimal class的virtual table,而不是直接从右手边的class object中将其vptr现值拷贝过来。

2.2.4 处理 Virtual Base Class Subobject

虚基类——Raccoon

虚基类的派生类——RedPanda

  1. 如果用一个虚基类Raccoon对象初始化另一个Raccoon对象,那么直接“bitwise copy”就可以了。

  1. 如果用一个虚基类的派生类RedPanda对象初始化一个Raccoon虚基类时:在这种情况下,为了完成正确的 little_critter 初值设定,编译器必须合成一个copy constructor,安插一些代码以设定virtual base class pointer/offset 的初值(或只是简单地确定它没有被抹消),对每一个members执行必要的memberwise初始化操作,以及执行其他的内存相关工作

little_red和little_critter的关系:

标签:object,Constructors,基类,2.2,拷贝,copy,class,构造函数
From: https://www.cnblogs.com/qiangz/p/15981508.html

相关文章

  • The Semantics of Constructors——2.1 默认构造函数的构造操作
    TheSemanticsofConstructors2.1DefaultConstructor的构造操作C++新手一般有两个常见的误解:任何class如果没有定义默认构造函数,就会被合成出一个来。编译器合......
  • The Semantics of Constructors——2.4 成员初始化列表
    2.4成员初始化列表(MemberInitializationList)当你写下一个constructor时,就有机会设定classmembers的初值。要不是经由memberinitializationlist,就是在constructor函......
  • The Semantics of Constructors——2.3 程序转化语意学
    2.3程序转化语意学#include"X.h"Xfoo(){Xxx;returnxx;}一个人可能会对代码做出以下假设:每次foo()被调用,就传回xx的值。如果classX定义了一个co......
  • 2.2总线的性能指标
    @目录一、总线传输周期二、总线时钟周期三、总线工作频率四、总线时钟频率五、总线宽度六、总线带宽1.概念2.注意点3.案例分析4.总结补充七、总线复用八、信号线数九、总结......
  • 2.2 什么是二进制数
    首先让我们来看一下二进制数转换成十进制数的方法:接下来,让我们来解释一下各数位的数值和位权相乘后“相加”这个处理的原因。其实大家所说的数值,表示的就是构成数值的各数......
  • 析构函数和构造函数的特点(在汇编中如何识别构造和析构)
    1.构造函数1.1概念​ 常用来完成对象生成时的数据初始化工作,支持函数重载,不可定义返回值,返回值为对象首地址,即this指针拷贝构造函数:参数为对象地址,返回值为this指针1......
  • FastJason 1.2.22-1.2.24 反序列化利用链分析
    前言休息了好像有一周了(慢慢的罪恶感),昨天在打比赛的时候做了一个php-cms的审计,然后激起了学习的热情。之前打比赛的时候遇到过fastjson的题,当时也就是直接用poc利用了,也......
  • 【Java AWT 图形界面编程】Dialog 对话框 ( 简介 | 模式对话框 | 非模式对话框 | Dial
    文章目录​​一、Dialog对话框简介​​​​二、Dialog构造函数​​​​三、Dialog对话框代码示例​​​​四、向Dialog对话框添加布局组件​​一、Dialog对话框简介D......
  • 2.2-2.3
    P2042[NOI2005]维护数列坑点:空间问题,要把删除了的节点循环利用修改操作的值可能为0时间问题,insert时直接把数列build(l,r),然后合并最大子段和,改了好几遍,每次以为改......
  • B/S端界面控件DevExtreme v22.2新功能 - 如何在日历中显示周数?
    DevExtreme拥有高性能的HTML5/JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NETCore,jQuery,Knockout等)构建交互式的Web应用程序,该套件附带功能......