《深度探索C++对象模型》1

C++对象模型:

《深度探索C++对象模型》1

多重继承模型示意:

《深度探索C++对象模型》1

第二章:构造函数 语意学

基类和派生类:

Bear yogi;

ZooAnimal franny=yogi;

《深度探索C++对象模型》1

在这里,很容易理解合成的copy构造函数将vptr指向基类的虚函数表,不然不仅造成数据切割(sliced),函数调用也混乱了。

返回值的初始化:

《深度探索C++对象模型》1

在下述四种情况下必须使用成员初始化列表:

《深度探索C++对象模型》1

上面的产生临时string效率很低,修改后可以提高:

《深度探索C++对象模型》1

在构造函数中可以使用成员函数来对数据成员进行初始化:

《深度探索C++对象模型》1

这是因为(可以在构造函数中使用成员函数的原因):

《深度探索C++对象模型》1

简单来说,编译器对成员初始化列表的处理:

《深度探索C++对象模型》1

第三章:Data语意学

一个空class对象占1字节:

《深度探索C++对象模型》1

影响虚继承类对象大小3因素:

《深度探索C++对象模型》1

《深度探索C++对象模型》1

而在visual C++:

《深度探索C++对象模型》1

类的静态数据成员,存放在程序的全局data section。

非静态数据成员:

《深度探索C++对象模型》1

将不相干的class凑成一对,并带有继承关系(只要继承不要多态):

《深度探索C++对象模型》1

将不相干的class凑成一对,并带有继承关系(只要继承不要多态)容易犯错:

《深度探索C++对象模型》1

犯第二个错的原因是编译器需要保留对齐空间,否则复制时出现覆盖:

《深度探索C++对象模型》1《深度探索C++对象模型》1

单一继承含虚函数对象布局:

《深度探索C++对象模型》1

多重继承数据布局:

《深度探索C++对象模型》1

虚拟继承数据布局:
《深度探索C++对象模型》1

指向数据成员的指针:

《深度探索C++对象模型》1

上一篇:CSS 用户界面样式


下一篇:windows API普通函数跟回调函数有何区别