[item 1]
一个空的class如:
Class X{};
//sizeof X == 1
事实上并不是空的,他有一个隐晦的1byte,那是被编译器安插进取的一个char。这使得这个class的两个objects得以在内存中配置独一无二的地址。
[item 2]
Static member functions的主要特性就是它没有this指针。以下的次要特性统统根源于其主要特性:
· 它不能够直接存取其class中的nonstatic members;
· 它不能够被声明为const、volatile、或virtual;
· 它不需要经由class object才能调用。
[item 3]
一个class只会有一个virtual table。每一个table内含有其对应的class object中所有active virtual functions函数实体的地址。
· 它可以继承base class所声明的virtual functions的函数实体。(该函数实体的地址会被拷贝到derived class的virtual table相对应的slot之中);
· 它可以使用自己的函数实体。这表示它自己的函数实体地址必须放在对应的slot之中;
· 它可以加入一个新的virtual function。这时候virtual table的尺寸会增大一个slot,而新的函数实体地址会被放进该slot之中。
由此可见每个class类型的virtual table都是可以预知的,并且同一虚函数在继承体系中的所有相关类的virtual table offset是固定的。执行期的多态只是决定条用哪一个函数实体而已。
多继承情况稍微复杂一些。在多重继承下,一个derived class内含n-1个额外的virtual tables,n表示其上一层base classes的数目)同一函数在virtual table中可能需要多笔对应的slots.
[item 3]
指向虚表的指针vptr,经由编译器所产生的代码,将在constructor(s)中被设立初值。
[Item 4]
当我们设计一个class,并以一个class object指定给另一个class object时,有三种选择:
1. 什么都不做,因此得以实施默认行为;
2. 提供一个explicit copy assignment operator;
3. 明确地拒绝把一个class object制定给另外一个class object.将copy assignment operator声明为private,并且只声明不定义。
[Item 5]
建议尽可能不要允许一个virtual base class的拷贝操作。甚至提供一个比较奇怪的建议:不要在任何virtual base class中声明数据。
虚基类在Derived class object中只有一份,拷贝操作容易给编译器带来额外负担。
[Item 6]
解析语义学:如果class没有定义destructor,那么只有在class内带的member object(或是class自己的base class)拥有destructor的情况下,编译器才会自动合成出一个。与是否拥有virtual function无关。
对于决定class是否需要一个程序层面的destructor,程序员需要考虑的是一个class object的生命在哪里结束?需要什么样的操作才能保证对象的完整?