不要混淆赋值和初始化,对于大多数类型而言,比起先调用默认构造函数然后调用赋值操作符,只调用一次拷贝构造函数是高效的
对于内置类型,也需要成员初值列(member initialization list)来初始化,对于const和reference,则是必须的
基类先于子类先初始化,class的成员变量初始化的顺序是以其声明的次序被初始化
不同编译单元内定义的non-local static对象
static对象包括global对象,定义于namespace,class,函数以及file作用域被声明为static对象
函数内的static对象称为local static对象,其他称为non-static对象,程序结束时,static对象被销毁,也就是它们的析构函数会在main()结束时被调用
C++不同编译单元内定义的non-local static对象的初始化相对次序并无明确定义
可以在设计上消除这个问题:将每个non-local static对象搬到自己的专属函数内(该对象在函数内被声明为static),然后函数返回其引用,non-local static对象便被local static对象替换了,这是Singleton模式常用的手法
任何non-const static对象,不论它是否是local还是non-local,在多线程下等待某事发生都会发生麻烦,处理这种麻烦的一种做法是在程序的单线程启动阶段,就手工调用所有reference-returning函数,可消除与初始化有关的竞态(race conditions)
请记住
- 为内置类型对象进行手工初始化,C++不保证初始化它们
- 构造函数最好使用成员初值列,成员变量的排列次序应该与其在class中的声明顺序相同
- 为免除"跨编译单元的初始化次序"问题,请以local static对象替代non-local static对象