读完C++对象模型书后,做一个笔记整理
第一章-关于对象
第二章-构造函数语义学
第三章-Data语义学
第四章-Function语义学
第五章-构造拷贝解析语义学
第六章-执行期语义学
第七章-在对象模型的尖端
C++默认构造函数会在需要的时候被产生出来,且只在编译器需要的时候才合成。且合成出来只执行编译器需要的行动。即使合成了默认构造函数,也不会将成员变量初始化为0,若要如此需要程序员提供明显的默认构造函数。
编译器默认构造函数在如下4种情况会合成出来(nontrival default constructor)
- 成员函数带有默认构造函数,则此class的implicit default constructor就是nontrivial。
- 在构造函数真正需要调用时才会合成默认构造函数。
- 且被合成的默认构造函数仅满足编译器需要,而非程序需要。
- 合成构造函数或扩张已存在的构造函数,会以在class中的声明次序调用每一个成员object的构造函数
- 带有默认构造的基类
- 子类的默认构造将会调用父类构造
- 若子类程序员给出其它构造,但无默认构造,则编译器会扩张现有构造,将用以调用所有必要之默认构造代码加入。
- 带有一个vritual funcion的类
- 若class 声明或继承一个virtual function 或 派生自继承串链,其中有1个或更多个虚基类,则也需合成默认构造
- 每个类会一个虚函数表, 存放类的虚函数地址,每个对象生成时都会有一个指针指向虚函数表
- 带有一个virtual base class的类
- 每种虚基类的实现均不同,但必须在执行期准备妥当虚基类在子类中的位置。
可以看出默认构造函数是用满足,要调用涉及到的构造函数,及虚函数,虚继承的。
至于不在以上4种情况中且又没声明任何构造的,他们拥有implicit trival default constructors 隐含无用默认构造函数。
如果类体现出位拷贝语义,则其拷贝构造函数是不必要的。有4 种情况不是位拷贝语义
- 类内包含一个拥有拷贝构造函数的的成员
- 类继承自一个有拷贝构造函数的基类
- 类中含有虚函数
- 类有一个或多个虚基类
- 拷贝构造需要正确设置vptr,如在父类 a=子类 b;这种情况时。
- 虚基类同样需要正确设置其位置。若父类有虚基类virtual base,父类 a=子类 b;编译器必须保证赋值后通过a也能正确访问虚基类。
构造函数中成员初始化列表先与任何用户代码执行,成员的初始化有4种情况必须使用成员初始化列表
- 初始化一个引用成员
- 初始化一个const 成员
- 调用一个基类的有一组参数的构造函数
- 调用一个成员的有一组参数的构造函数
- 成员初始化列表的顺序以class中的声明顺序决定,而非成员初始化列表中书写顺序
- 而在成员初始化列表中调用成员函数来为变量初始化,是可以的,但若子类成员函数的结果当成父类构造的参数,则会未知结果,因为在子类成员初始化列表执行时,先调用父类构造,再初始化子类,故子类成员函数返回结果,可能是未知的。
下一篇 第三章-Data语义学