条款04:确定对象被使用前以先被初始化
- 最佳的处理办法是:永远在使用对象之前将它初始化。
1.内置类型手工完成
2.自定义类型通过构造函数完成
注意:不要混淆了赋值(assignment)和初始化(initialization)
- 对象的成员变量的初始化动作发生在进入构造函数本体之前(对象的默认构造函数将被调用)
用member initialization list(成员初值列)替换赋值动作
使用成员初值列调用对象的拷贝构造函数进行初始化,效率高于先调用默认构造函数再进行赋值的操作
Default构造函数也可以使用成员初始列构造——指定无物(nothing)作为初始化实参,例子如下:
Widget::Widget()
:theName(),//std::string
theAddress(),
thePhones(),
numTimesConsulted(0){}
注意:使用成员初值列时列出所有成员变量(包括内置数据类型),避免遗漏
以下两种情况必须使用初值列(赋值会报错):
1.成员变量是const
2.成员变量是references
成员初始化次序
- base classes更早于其derived classes被初始化
- class的成员变量总是以其声明次序被初始化(无论他们在初值列中的出现次序)
因此初值列中成员出现次序最好为他们的声明次序
不同编译单元内定义的non-local static对象的初始化次序
non-local static对象:函数内的static对象称为local static对象(因为他们对函数而言是local),其他static对象称为non-local static对象
编译单元: 指产出单一目标文件的那些源码
C++对“定义于不同编译单元内的non-local static 对象”的初始化相对次序并无明确定义,因此可能会出现一个单元内的non-local static 对象使用了另一单元内未初始化的non-local static对象的问题
解决办法:将每个non-local static对象搬到自己的专属函数内(该对象在此函数内被声明为static),这些函数返回一个reference指向它所含的(static)对象。——即将non-local static对象通过函数用local static对象替换。(Singleton模式)
Widget&widget(){
static Widget m_widget;
return m_widget;
}
请记住:
1.为内置型对象进行手工初始化,因为C++不保证初始化它们。
2.构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同。
3.为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象(通过reference-returning函数)。
本文详细讲解了在C++编程中如何确保对象在使用前正确初始化,包括内置类型和自定义类型的初始化方法,以及成员变量的初始化顺序、const和reference成员的处理。还提到了避免跨编译单元初始化问题的解决方案,如使用localstatic对象替代non-localstatic对象。
757

被折叠的 条评论
为什么被折叠?



