本文是 Inside The C++ Object Model's Chapter 2  的部分读书笔记。

有三种情况,需要拷贝构造函数:

1)object直接为另外一个object的初始值

2)object作为函数以值传递的参数

3) object以函数返回值形式返回

如 果class没有提供一个explicit copy constructor时,编译器会以default memberwise initialization,也就是把每一个内建的或者派生的data member的值,从某个object直接拷贝到另外一个object上,对于member class object,以递归的方式施行memberwise initialization。

编译器并不会生成trivial的copy constructor,除非是bitwise copy semantics,以下四种情况就是非bitwise copy semantics:

1)class的某个member object声明有一个copy constructor时,这个copy constructor不会是被设计者声明的,或者是被编译器合成的

2)class继承自的base class含有copy constructor时

3)class含有virtual functions

4)class的base class是virtual时

编译器需要合成copy constructor,并且调用member object或者base class的copy constructor。

对 于virtual function或者virtual inheritance,编译器需要为每一个object设计好vptr以便在runtime获取到正确的virtual function table。因为vptr处理不好有可能发生对象的sliced,导致出现blow up。

总结:

如 果class是bitwise copy semantics,那么编译器不会合成copy constructor,只是按照default memberwise initialization copy source object到destination object。否则,编译器将合成copy constructor,以调用member object或者base class的copy constructor或者使得vptr设置好,使得在runtime可以使virtual base class或者base class可以正确访问virtual functions。

注意,本文只是说明编译器在copy constructor上为我们做了什么,并不是编译器合成的copy constructor就是安全可用的。这里需要和deep copy(深拷贝)/shallow copy(浅拷贝)加以区别。和编译器是否为我们合成default constructor一样,它只是完成自己的职责,并不会为non class member object and non-static members 初始化。 如果需要deep copy,设计者必须explicit declare copy constructor。否则即使编译器合成了,也会使得程序出现undefined behaviors。

The Semantics of Constructors(拷贝构造函数之编译背后的行为)的更多相关文章

  1. C++对象模型(二):The Semantics of Copy Constructors(拷贝构造函数之编译背后的行为)

    本文是 Inside The C++ Object Model's Chapter 2  的部分读书笔记. 有三种情况,需要拷贝构造函数: 1)object直接为另外一个object的初始值 2)ob ...

  2. 关于C++中的拷贝构造函数和赋值函数

    如果类定义的数据成员中存在指针或引用,那么最好重载这两个函数. 1.     定义 拷贝构造函数的定义格式:构造函数名(const 源类名& 引用对象形参名){} 赋值函数定义格式:源类名 & ...

  3. C++中构造函数,拷贝构造函数和赋值函数的区别和实现

    C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...

  4. C++对象模型的那些事儿之四:拷贝构造函数

    前言 对于一个没有实例化的空类,编译器不会给它默认生成任何函数,当实例化一个空类后,编译器会根据需要生成相应的函数.这类函数包括一下几个: 构造函数 拷贝构造函数 析构函数 赋值运算符 在上一篇博文C ...

  5. C++类中拷贝构造函数详解

    a. C++标准中提到"The default constructor, copy constructor and copy assignment operator, and destruc ...

  6. C++ 一个例子彻底搞清楚拷贝构造函数和赋值运算符重载的区别

    class TestChild { public: TestChild() { x=; y=; printf("TestChild: Constructor be called!\n&quo ...

  7. PoEdu - C++阶段班【Po学校】- Lesson03-4_构造函数&赋值函数&拷贝构造函数&学习方式 - 第6天

    PoEdu - C++阶段班[Po学校]- 第6天 课堂选择题目: 1  关于转换构造函数  ClassDemo demo = 1;  调用转换构造函数 2  关于拷贝赋值函数  demo =2; 首 ...

  8. 【转】C++的拷贝构造函数深度解读,值得一看

    建议看原帖  地址:http://blog.csdn.net/lwbeyond/article/details/6202256 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很 ...

  9. 从一个例子讲解拷贝构造函数与return

    #include "iostream" using namespace std; class Location { public: Location(, ) { X = xx; Y ...

随机推荐

  1. luogu P3959(2017noipTG D2T2

    luogu P3959(2017noipTG D2T2 不知道为什么,这两天见了好多伪装成图的dp题,这道也是. 最短路只有40分,实际上可以从数据范围n<=12看出来是状压dp. soluti ...

  2. PHP以星号隐藏用户名手机号码和邮箱实例

    一款简单实用的PHP以星号隐藏用户名手机号码和邮箱实例,将用户的一些文字信息隐藏一部分用星号代替,以便于保护用户隐私. 隐藏函数: function hideStar($str) { //用户名.邮箱 ...

  3. Java设置时区

    TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));

  4. 小米soar

    SOAR 简介 SOAR,即 SQL Optimizer And Rewriter,是一款 SQL 智能优化与改写工具,由小米运维 DBA 团队出品 SOAR 体系架构 SOAR主要由语法解析器,集成 ...

  5. IDirect3DSurface9的D3DFORMAT格式

    /* Formats * Most of these names have the following convention: * A = Alpha * R = Red * G = Green * ...

  6. 22-Perl Socket 编程

    1.Perl Socket 编程Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. ...

  7. Sql Server--如何自动备份数据

    下面我来讲一下如何通过维护计划来实现完整备份+差异备份: (1)在SSMS的对象资源管理器中右击“维护计划”,选择“维护计划向导”,系统将弹出向导窗口,如图: 这里向导已经告诉我们维护计划到底能够干什 ...

  8. DisableThreadLibraryCalls与DLLMain死锁

    1.首先写个简单的DLL,用来验证 BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserve ...

  9. linux 之内存与磁盘

    记录工作中常用操作 1. 新建和增加SWAP分区(都必须用root权限,操作过程应该小心谨慎.) 1)新建分区 .以root身份进入控制台(登录系统),输入 swapoff -a #停止所有的swap ...

  10. vscode调试npm包技巧

    官网文档:https://code.visualstudio.com/docs/nodejs/nodejs-debugging node调试方法(日志和debuuger):https://blog.r ...