第一章关于对象
- c++在布局和存取时间的额外负担主要有virtual引起
- virtual function:运行期动态绑定
- virtual base class :base class多次出现在派生类中,但只有一个单一而被共享的实体(虚基类)
- 对象模型
简单模型:每一个地址slot指向一个成员
- 表格模型:数据表和成员函数表
- 数据表包含数据本身
- 成员函数表包含指向每个成员函数的指针slot
- 虚函数表
- 每个class产生一堆指向virtual function的指针,,指针形成一个virtual function table;
- 每一个class object 添加一个指向virtual function table 的指针vptr
每一个class 关联一个type_info object由虚函数表指出
被指定的object在执行点之前是无法确定类型的,必须通过指针或者引用操作实现
- c++支持多态的方式
- 隐含转化操作,子类指针赋值给父类指针
- virtual function
- dynamic_cast 和 typeid
- 基类定义接口,通过virtual function方式,在运行时确定object类型并执行相应操作
- 继承后类及对象的内存布局
- 继承关系
- 内存布局
- 虚函数表
第二章 构造函数
2.1 default constructor 的构建
- 生成default constructor 的要素:
- 含有member object 且member object 均有default constructor
- class本身无任何constructor,则调用constructor 时编辑器将为class合成一个default constructor
- 以member objects 在class 声明次序调用各个member object 的 default constructor
如果derived class 拥有多个constructor 但是没有default constructor,编译器将扩张每一个consturctor,加入每一个必要的基类default constructor,但不会再合成default constructor
2.1.1“带有default constructor ”的base class :
- 自动合成default constructor - class 声明(继承)一个virtual function - class 派生自一个继承串联,其中至少一个virtual base class
- 自动合成过程
- 产生一个virtual function table,内放class的virtual functions 地址
- 每一个class object合成一个pointer(vptr)指向class 的virtual function table
已定义constructor则扩展,未定义则合成default constructor, 保证正确初始化每一个class object 的vptr
2.1.2“带有一个virtual base class”的class
- 在derived class object 的每一个virtual base class 中插入一个指向,经由pointer 和reference 存取virtual base class 的操作由这个指针完整(指向同一份内容)
- 已定义constructor则扩展,未定义则合成default constructor, 保证允许每一个virtual base class 执行器存取操作
- summary:合成 implicit nontrivial default constructor
- 借用member object 或者 base class 的default constructor
- 为每一个object 初始化virtual function机制 或者 virtual base机制
- 除以上以外,如无任何声明constructor 则不会合成default constructor
- 合成的default constructor 中只有base class objects 和member class objects 被初始化,其他nonstatic data member,指针,数组都不会自动初始化
- 解析 ``
- 不是任何class都会合成 deafault constructor,只有member object 或者 base class 有default constructor 时,或者需要初始化virtual function 机制和virtual base class 机制时,合成default constructor
编译器合成的default constructor 并不会明确初始化每一个data member值
``2.2 copy constructor 的构建
- 执行copy constructor的三种情况:
- 赋值
- 作为参数传递
- 作为返回值
- default memberwise initialization
- 对于member data 逐一赋值
对于member function 递归调用 memberwise initialization
- 当class 不展现一个“bitewise copy semantics”(如下四种情况),需要合成copy constructor
- class 内包含一个member object 且后者(声明或者合成)copy constrctor 时
- class 继承一个base class 且后者(声明或者合成)copy constrctor 时
- class 声明至少一个virtual function时
- class 派生自一个继承串联,其中至少一个virtual base class
- 执行copy constructor的三种情况:
2.3 program transformation semantics
- explicit initialization:直接逐位赋值member data
- argument initialization:参数构造临时对象并copy constrcuct
- copy construct and 返回引用
2.4 member initialization list
- initial 时:= 操作符以arguement初始化对象时分为三步:1、以arguement 构造一个 临时对象,2、将临时对象copy给目标对象,3、销毁临时对象
- 初始化顺序是由members声明次序决定的,不是由member list 顺序决定的;
- member list 中初始化先于explicit assignment:即:之后的初始化先于{}内部member data的初始化或者赋值
X::x(int v):j(v){i = j;}j 的初始化先于i的初始化
第三章 the semantaic of data
3.1 data member 绑定
- 局域绑定
3.2 data member layout
- 同一access session 按照声明顺序合并,静态成员不存在class 内部
3.3 data member 存取
- static data member > 独立于class 之外,不论是继承virtual base class而来或者函数调用得到的static 都是直接存取,通过指针和通过对象存取是一样的- nonstatic data member > 通过指向对象的指针和对象访问一致的,当访问的member data是一个从virtual base class 继承而来的member时,指针访问在运行时才能确定- 多重继承![pointer实现:共享虚基类](http://odfcr7qs4.bkt.clouddn.com/IMG_0073.PNG)![offset实现:共享虚基类](http://odfcr7qs4.bkt.clouddn.com/IMG_0074.PNG)- 多重继承的数据布局![](http://images2015.cnblogs.com/blog/900750/201702/900750-20170211192953869-280093158.png)- 虚拟继承: - 指针方式实现- 虚函数表首项偏移指向虚基类
3.6 pointer to data member
* &Pointer::z “取一个nonstaic data member,得到它在class 中的偏移量”* &origin.z “取一个class object 的data menber地址, 得到member在内存中的真正地址”* 继承层次越深,指针代码执行速度越慢
第四章 the semantics of function
4.1 member 调用方式
* nonstatic member function 〉 0. 安插this指针 1. 对nonstatic member function 经由this 指针存取 2. 将member function 改写成独一无二(name mangling)的外部函数 - nonstatic member function 与外部函数的访问性能是一样的* virtual member function > 经由对象调用virtual function 被处理为编译绑定,与nonstatic member function的调用方式一致* static member function > 0. 通过指针或者对象调用静态成员函数都被当做一般函数处理 〉 1. static member function 没有this 指针,被当做一般函数处理
第五章 the semantics of construction destruction and copy
5.1 无继承的对象构造
- bitwise member copy
- ADT class 执行default copy constructor,copy constructor, destructor,但是并不产生相应函数
- 构造函数初始化vptr,构造函数不可以虚,构造函数内部调用虚拟函数不能实现多态只能调用本地版本
传值方式传回一个local class object 时最好定义一个copy constructor,以避免被NRV优化
5.2 继承体系下的对象构造
- vptr 初始化语义学
- 在class的constructor 或者 destructor 中调用一个virtual function ,调用的必须是本class 中的那个function实体
- vptr初始化时间在base class constructor 调用后member initialization list 所列members之前,以保证初始化过程中幻化出完整的基类对象
只有在默认行为不安全或者不正确是才需要设计一个copy assignment operator
- dervied class constructor 中所有virtual base class 和base class constructor 被调用
- 对象vprt被设置,指向相关virtual function table
- member initialization list 在constructor 内部展开
- 执行程序直接赋值代码和生成对象的代码
- 不要在虚基类中声明数据,避免copy assignment operator 的不完整性
5.5 semantics of destructor
如果class 未声明destructor 且member object 拥有destructor ,编译器自动合成destructor,否则不合成
- destructor 函数本身最先执行
- 拥有destructor 的 member class object按声明顺序相反执行自己的destructor
- object 内带vptr 重置,指向响应基类virtual table
- 直接上层的nonvirtual base class 以其声明的顺序的逆序执行destructor
- virtual base class 按照与构造顺序相反的顺序执行destructor
第六章 runtime semantics
6.2 new delete 运算符
- new 和delete 底层以malloc 和free 实现- new 失败,必须在new 内部完成已分配空间的释放
6.3 临时对象的处理
- 临时对象的销毁,必须在完整表达式求值过程的最后,该完整表达式造成临时对象的生成- 如果临时对象被reference 对象将残留到reference 生命周期结束
第七章 on the cusp of the object model
template
> member function 只在使用时具现出来- template class 中所有与类型有关的检验,如果牵涉到template 参数,都将延迟到真正的具现操作发生
异常处理
- exception handing 快速检阅> 0. throw 子句,发出exception 1. 多个catch 子句捕获相应类型的exception 2. try区段处理- 异常抛出后,控制权转移,函数调用也被推离,在函数堆栈推离前local class objects 的destructor会被调用直到找到一个吻合的catch子句,或者直到堆栈被unwound而terminate已被调用 - 异常对象以复制构造方式传入catch子句,处理完成后后local excepton object被销毁,处理终结或者将原异常对象继续抛出
RTTI
> dynamic_cast 通过vptr指向type_info运行时判定类型实现转型,比static_cast代价高但是更安全> dynamic_cast 应用于pointer 时,安全转型则直接向下转型,不安全则pointer置0> dynamic_cast 应用于reference 时,安全转型则直接向下转型,不安全则返回一个bad_cast exception> typeid 返回一个 const reference,类型为type_info,