条款4:确定对象在被使用前已被初始化
永远在使用对象前现将其初始化(1.对于无成员的内置类型必须手工完成初始化,2.对于自定义类型交给构造函数(每个构造函数都将对象的每个成员初始化))
在构造函数内对各成员进行赋值的操作叫做赋值。对象的成员变量的初始化动作在进入构造函数本体之前,即各成员的default构造函数被调用时(除内置类型)。
使用构造函数的成员初值列进行初始化更为高效,并且在初值列中应该列出所有成员变量。(特别是当类和其基类拥有共同的成员变量时多份初始化列即可能存在重复,此时应遗漏“赋值表现与初始化一样好”的成员变量,将他们赋值移至private函数中供所有构造函数调用)。
问题:解决在不同编译单元内定义的non-local static对象的初始化次序。
static对象表示其寿命从构造出来直到程序结束,non-local static表示除了在函数内的global、namespace、class、file内的static对象。
编译单元指产生单一目标文件的那些源码。基本是单一源文件加上其包含的头文件。
解决方案:采用单例模式,将每一个non-local static对象搬到自己的专属函数中(该对象在此函数内声明为static)。这些函数返回一个reference只想它所含的对象。然后用户调用这些函数。(non-local static对象被local static对象替换了)。
函数内的local static对象会在“该函数被调用期间”“首次遇上该对象的定义式”时被初始化。