1.初始化规则
- 如果使用C part of C++而且初始化可能招致运行期成本,那么就不保证发生初始化。
- non-C parts of C++,规则有些变化。这就很好地解释了为什么array(来自C part of C++)不保证其内容被初始化,而vector(来自STL part of C++)却有此保证
2. 使用初始化列表
- C++规定,对象的成员变量的初始化动作发生在初始化列表中,构造函数中的是赋值。
- 对于非内置类型初始化列表成本更低,因为赋值之前会先调用default构造函数进行初始化,然后再调用构造函数进行赋值。内置类型成员列表初始化和构造函数内赋值成本一样,为了统一内置类型也使用成员列表初始化。
- 总是再初值列中初始化所有成员变量。
- 当一个类拥有多个构造函数,为了避免初值列的重复,可以合理地在初值列中遗漏那些“赋值表现像初始化一样好”的成员变量(内置类型),改用它们的赋值操作,并将那些赋值操作移往某个函数(通常是private),供所有构造函数调用。
3.初始化次序
- base classes更早于其derived classes被初始化
- class的成员变量总是以其声明次序被初始化
- 不同编译单元内定义之non-local static对象”的初始化次序:
1)static对象包括global对象、定义于namespace作用域内的对象、在classes内、在函数内、以及在file作用域内被声明为static的对象 2)local static对象 函数内的static对象 3)non-static对象 其他范围的static对象 4)编译单元是指产出单一目标文件(single object file)的那些源码。基本上它是单一源码文件加上其所含入的头文件(#include files)。 5) 不同编译单元内定义之non-local static对象”的初始化次序无法保证,通常按如下方式处理(单例): 6)static是非线程安全的
|