一、C++对象模型中nostatic data member被置于每一个class object中,static data member、static function member和nostatic function member都被存放在所有的class object之外。virtual function则有如下两个特性支持:
1、每个class产生一堆指向virtual function的指针放在称为virtual table(vtbl)的表格之中.
2、每个object对象产生一个指针,指向相关的virtual table,此指针被称为vptr。
二、默认构造函数
有四种情况编译器会为没有构造函数的类生产默认构造函数,默认构造函数只满足编译器的需求而非程序的需求。
(1)有默认构造函数的成员变量对象
(2)有默认构造函数的基类
(3)带有虚函数的类
(4)带有虚基类的类
不是上面四种情况而又没有声明任何构造函数的类不会有默认构造函数。
默认构造函数只会对类中有构造函数的对象进行调用构造函数的操作,对于没有构造函数的对象生成一个没有意思的构造函数调用相当于没有操作,对于变量不进行操作。默认构造函数的调用顺序按类中成员对象的声明顺序进行。
两个错误观点:
(1)任何类没有定义构造函数就会生成一个默认构造函数。
(2)编译器合成出来的默认构造函数会明确设定每个成员函数的值。
三、初始化列表
初始化列表的效率比赋值初始化的方式更高,尤其对于对象的初始化,但是初始化列表的执行的顺序和列表本身无关按成员变量的声明顺序依次执行,这样会存在如下陷阱。
class A
{
int i;
int j;
public:
A(int value):j(value),i(j)
{}
}
这里会初始化列表中i(j)其实比j(value)更早执行,所以i的值其实是一个未知值,而不是期望的value。
修改为如下
A(int value):j(value)
{
i = j;
}
则没有问题,原因是初始化列表会先于用户代码执行。四、类的大小
类的大小受到下面三个因素影响
(1)语言本身造成的额外负担
(2)编译器对于特殊情况提供的优化处理
(3)alignment限制,即将字节调整到某个数值得整数倍的字节对齐方案