The Semantics of Constructors(拷贝构造函数之编译背后的行为)
本文是 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(拷贝构造函数之编译背后的行为)相关推荐
- 构造函数,拷贝构造函数,赋值函数
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个 ...
- 构造函数、拷贝构造函数、赋值函数和析构函数
文章目录 一.构造函数 1.认识构造函数 2.初始化列表 二.拷贝构造函数 1.类对象的拷贝 2.浅拷贝和深拷贝 三.赋值函数 四.析构函数 1.认识析构函数 2.销毁,清理? 3.析构函数来阻止该类 ...
- 《深入探索C++对象模型》第二章 构造函数语义学(The Semantics of Constructors)
一.default constructor的构造操作 先看一个小例子: class Foo { public: int val; Foo *pnext; }; 此处正确的程序语意是要求Foo有一个默认 ...
- C/C++编程:拷贝构造函数的构建操作
有三种情况,会以一个对象的内容作为另一个类对象的初值 最明显的一种情况是对一个对象做明确的初始化操作,比如: class X{ ... }; X x; X xx = x; // 明确的以一个对象的内容 ...
- C++ 笔记(17)— 类和对象(构造函数、析构函数、拷贝构造函数)
1. 构造函数 构造函数是一种特殊的函数(方法),在根据类创建对象时被调用.构造函数是一种随着对象创建而自动被调用的函数,它的主要用途是为对象作初始化. 构造函数的名称与类的名称是完全相同的,并且不会 ...
- 函数返回类的对象与拷贝构造函数
C++中,如果我们在一个函数中,定义了一个类的对象,然后返回这个对象,在main函数中用一个对象去接受这个返回的对象的时候,这里面参与的函数调用大家可能不熟悉,这里通过程序和注释的方式给大家讲解一下. ...
- C++复制控制:拷贝构造函数
一.拷贝构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用.与默认构造函数一样 ,拷贝构造函数可由编译器隐式调用.拷贝构造函数应用的场合为: (1)根据另一个同类 ...
- C++拷贝构造函数详解
一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: [c-sharp] view plaincopy int a = 100; int b = a; 而类对象与普通 ...
- 拷贝构造函数的参数类型必须是引用
在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识. 但是如果我问你"拷贝构造函数的参数为什么必须使用引用类型?"这个问题, 你 ...
- 【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符
学习资料 • 派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值 • C++ 基类构造函数带参数的继承方式及派生类的初始化 定义拷贝构造函数 [注意]对派生类进行拷贝构造时,如果想让基类的成 ...
最新文章
- 卡尔曼滤波——车定位(GPS与车运动方程)
- brew 安装PHP的配置文件所在位置
- Kafka消息丢失、重复消费的解决方案
- ICCV 2017 PTAV:《Parallel Tracking and Verifying:A Framework for Real-Time and High Accuracy ...》论文笔记
- netty系列之:Event、Handler和Pipeline
- UNIX操作-命令快捷键
- 【转】DICOM医学图像处理:DIMSE消息发送与接收“大同小异”之DCMTK fo-dicom mDCM
- route add添加静态路由
- Linux Page Cache机制
- 关于new 和delete的灾祸
- 如何把握软件产品的质量
- 11kw星三角启动延时几秒_带有延时启动的星角接启动方法
- 厉害了!有同学抽时间整理了一份IDEA中如何使用Git进行项目管理的完整教程?...
- Google Maps API 中的标注编程
- mescroll.js 的下拉刷新和上拉加载 tab切换
- 一纬度横直线等于多公里_【归纳整理】高中地理必修一知识点总结
- winword.exe应用程序错误
- Es6中Promise链式调用then方法
- 自动化测试+性能面试题整理--个人最新【持续更新】
- 微信小程序 SOTER 生物认证DEMO,指纹识别