本文是 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。

转载于:https://www.cnblogs.com/anzhsoft/p/3464327.html

The Semantics of Constructors(拷贝构造函数之编译背后的行为)相关推荐

  1. 构造函数,拷贝构造函数,赋值函数

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

  2. 构造函数、拷贝构造函数、赋值函数和析构函数

    文章目录 一.构造函数 1.认识构造函数 2.初始化列表 二.拷贝构造函数 1.类对象的拷贝 2.浅拷贝和深拷贝 三.赋值函数 四.析构函数 1.认识析构函数 2.销毁,清理? 3.析构函数来阻止该类 ...

  3. 《深入探索C++对象模型》第二章 构造函数语义学(The Semantics of Constructors)

    一.default constructor的构造操作 先看一个小例子: class Foo { public: int val; Foo *pnext; }; 此处正确的程序语意是要求Foo有一个默认 ...

  4. C/C++编程:拷贝构造函数的构建操作

    有三种情况,会以一个对象的内容作为另一个类对象的初值 最明显的一种情况是对一个对象做明确的初始化操作,比如: class X{ ... }; X x; X xx = x; // 明确的以一个对象的内容 ...

  5. C++ 笔记(17)— 类和对象(构造函数、析构函数、拷贝构造函数)

    1. 构造函数 构造函数是一种特殊的函数(方法),在根据类创建对象时被调用.构造函数是一种随着对象创建而自动被调用的函数,它的主要用途是为对象作初始化. 构造函数的名称与类的名称是完全相同的,并且不会 ...

  6. 函数返回类的对象与拷贝构造函数

    C++中,如果我们在一个函数中,定义了一个类的对象,然后返回这个对象,在main函数中用一个对象去接受这个返回的对象的时候,这里面参与的函数调用大家可能不熟悉,这里通过程序和注释的方式给大家讲解一下. ...

  7. C++复制控制:拷贝构造函数

    一.拷贝构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用.与默认构造函数一样 ,拷贝构造函数可由编译器隐式调用.拷贝构造函数应用的场合为: (1)根据另一个同类 ...

  8. C++拷贝构造函数详解

    一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: [c-sharp] view plaincopy int a = 100; int b = a; 而类对象与普通 ...

  9. 拷贝构造函数的参数类型必须是引用

    在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识. 但是如果我问你"拷贝构造函数的参数为什么必须使用引用类型?"这个问题, 你 ...

  10. 【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符

    学习资料 • 派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值 • C++ 基类构造函数带参数的继承方式及派生类的初始化 定义拷贝构造函数 [注意]对派生类进行拷贝构造时,如果想让基类的成 ...

最新文章

  1. 卡尔曼滤波——车定位(GPS与车运动方程)
  2. brew 安装PHP的配置文件所在位置
  3. Kafka消息丢失、重复消费的解决方案
  4. ICCV 2017 PTAV:《Parallel Tracking and Verifying:A Framework for Real-Time and High Accuracy ...》论文笔记
  5. netty系列之:Event、Handler和Pipeline
  6. UNIX操作-命令快捷键
  7. 【转】DICOM医学图像处理:DIMSE消息发送与接收“大同小异”之DCMTK fo-dicom mDCM
  8. route add添加静态路由
  9. Linux Page Cache机制
  10. 关于new 和delete的灾祸
  11. 如何把握软件产品的质量
  12. 11kw星三角启动延时几秒_带有延时启动的星角接启动方法
  13. 厉害了!有同学抽时间整理了一份IDEA中如何使用Git进行项目管理的完整教程?...
  14. Google Maps API 中的标注编程
  15. mescroll.js 的下拉刷新和上拉加载 tab切换
  16. 一纬度横直线等于多公里_【归纳整理】高中地理必修一知识点总结
  17. winword.exe应用程序错误
  18. Es6中Promise链式调用then方法
  19. 自动化测试+性能面试题整理--个人最新【持续更新】
  20. 微信小程序 SOTER 生物认证DEMO,指纹识别

热门文章

  1. Debian 鼠标左右手
  2. 了解 Nginx 主要应用场景
  3. 解决相片上传主键唯一性问题,java 上传相片到服务器的时候,相片保存主键用guid。...
  4. XML 文档四种解析放式
  5. android如何获取系统开机时间
  6. 手把手写一个vue3的组件
  7. 解决fiexd和transform一起用导致的失效问题
  8. vuex的基础小案例(黑马教程)
  9. 移动端学习笔记(黑马教程)-基础概念
  10. Linux设置时间和硬件时间