条款四 确定对象使用前已经被初始化
对象成员变量初始化问题
对象成员变量都是在调用构造函数的时候被初始化的。
class A{
A();
private:
int a = 1;// 没有进行初始化,但是进行了声明,这个值会在初始化的时候赋值给他
char b;
string str;
}
// 初始化时间
A::A()
:a(),b(),str(){ // 这里进行变量的初始化,无论有没有显性的调用都会自动进行初始化
a = 1; // 这里是属于初始化之后的重新调用拷贝构造函数进行赋值了,效果没有那么好
}
- 尽量在初值中初始化,效率高
- 初值初始化可以避免奇怪的初始值问题
- 初始话的次序总是按照类中声明的顺序进行
静态成员变量进行初始化问题(local-static / non-local-static)
因为static只有在被执行到的时候才会进行初始化。
non-local static 变量可能是放在不通的namespace 或者是不通的文件里面的,那么初始化的顺序就会出现混乱。
如果初始化前就调用了,会出现错误。
所有对于non-local static变量一般使用singlon的方式来封装起来
TypeClass& GetTypeClass(){ // 需要使用直接调用GetTypeClass() , 而不访问对象。
static TypeClass A;
return A:
}