1.为内置对象进行 "手工初始化",因为C++不保证初始化他们(内置类型在赋值与初始化销毁基本相同,最好还是进行初始化列表),在内置类型过多情况下,可选择private函数统一初始化(赋值与初始化效率持平)
2.构造函数最好使用成员初始化列表方式,构造函数体内属于赋值操作,且初始化列表最好与声明变量次序保持一致(成员变量实际初始化次序与声明次序一致)
3.为免除 "跨编译单元之初始化次序"问题,请以 "local-static" 对象替换 "non-local-static"(即单例模式(singleton));
编译单元:指产出单一目标文件,包括 源码和头文件,所以这涉及2个源码文件了
non-local-static:位于global对象,或者匿名namespace作用域,class内,file内都称为non-local-static,而函数内的称为local-static(stack/heap-based 除外);
Total : 2个不同的编译单元内各含有自己的non-local-static变量,且其中一个static变量需要另一个static变量,它所用到的static可能未完成初始化,C++中 "不同编译单元定义的non-local-static" 初始化次序无明确定义.
解决办法: 使用函数内local-static定义,因为C++保证函数内的"local-static"对象,会在 "该函数调用期间" “首次遇到该对象定义式” 时初始化;
拓展:多个编译单元的 "non-local-static" 对象经由 "模板隐式具现化" 形成!
1 //Effective C++ NO.4 2 3 4 class Demo 5 { 6 public: 7 Demo(){}; 8 9 Demo& SingleMode()10 {11 static Demo Demo_static;12 return Demo_static;13 }14 };