非静态的数据成员被配置在每一个类对象中,静态数据成员则被放在所有的类对象之外,静态的和非静态的成员函数也被放在所有的类对象之外。虚函数则以两个步骤支持:
- 每一个类产生出一堆指向虚函数的指针,放在虚函数表(vtbl)中。
- 每一个类对象增加一个虚指针(vptr),指向虚函数表。虚指针的指定和重制都由每一个类的构造,析构和拷贝赋值运算符自动完成。
C++程序的多态性,只有通过指针和引用来实现。
一个类对象的内存占用:
- 其非静态数据成员的总和大小。
- 加上任何由于对齐的需求而填补上去的空间。
- 加上为了支持virtual而由内部产生的任何额外负担。
关键字explicit,就是为了提供给程序员一种方法,来避免使单一参数的构造函数被当作转换运算符。
编译器会在下面四种情况下,生成默认构造函数:
- 其中一个成员类对象带有默认构造函数。
- 基类带有默认构造函数。
- 该类中含有虚函数。
- 该类带有一个虚基类
在三种情况下,会调用类的拷贝构造函数:
- 对一个类做明确的初始化,比如A a = x;
- 当对象被当作参数交给某个函数。
- 当函数返回一个类对象。
成员初始化列表:
- 引用成员
- 常量成员
- 当调用基类带参数构造函数。
- 当调用成员类的单参数构造函数
在构造函数成员初始化列表中的成员,初始化顺序比在显示用户初始化代码之前。