学会从C++ Object Model着手分析(二)

来源:互联网 发布:淘天下网络pos机 编辑:程序博客网 时间:2024/05/22 04:52

[item 1]

一个空的class如:

Class X{}

//sizeof X == 1

事实上并不是空的,他有一个隐晦的1byte,那是被编译器安插进取的一个char。这使得这个class的两个objects得以在内存中配置独一无二的地址。

 

[item 2]

Static member functions的主要特性就是它没有this指针。以下的次要特性统统根源于其主要特性:

·        它不能够直接存取其class中的nonstatic members;

·        它不能够被声明为constvolatile、或virtual;

·        它不需要经由class object才能调用。

[item 3]

一个class只会有一个virtual table。每一个table内含有其对应的class object中所有active virtual functions函数实体的地址。

·        它可以继承base class所声明的virtual functions的函数实体。(该函数实体的地址会被拷贝到derived classvirtual table相对应的slot之中);

·        它可以使用自己的函数实体。这表示它自己的函数实体地址必须放在对应的slot之中;

·        它可以加入一个新的virtual function。这时候virtual table的尺寸会增大一个slot,而新的函数实体地址会被放进该slot之中。

由此可见每个class类型的virtual table都是可以预知的,并且同一虚函数在继承体系中的所有相关类的virtual table offset是固定的。执行期的多态只是决定条用哪一个函数实体而已。

多继承情况稍微复杂一些。在多重继承下,一个derived class内含n-1个额外的virtual tablesn表示其上一层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的生命在哪里结束?需要什么样的操作才能保证对象的完整?

 

 

原创粉丝点击