#条款04:确定对象在使用前已被初始化
如有问题,欢迎交流指正
永远在使用对象之前先将它初始化,特别是内置类型。
- 构造函数的初始化任务使用 m e m b e r i n i t i a l i z a t i o n l i s t member\,initialization\, list memberinitializationlist替换函数体中的赋值动作。
- C++规定,对象的成员变量的初始化动作发生在进入构造函数函数体之前。
- 规定总是在初值列中给出所有成员变量,以免还得记住哪些成员变量无需初值。
- 如果类中存在多个构造函数,为避免初值列中出现令人不快的重复。可以合理地在初值列中“遗漏”那些“赋值表现的像初始化一样好”的成员变量,改用它们的赋值操作,并将这些赋值操作移动到一个函数中实现(
private
),供所有构造函数调用。- 初值列的初始化顺序参照声明顺序,所以在编写初值列时最好也按照声明顺序。
- “不同编译单元内定义之 n o n − l o c a l s t a t i c non-local\,static non−localstatic对象”的初始化次序
- 所谓编译单元是指产出单一目标文件的那些源码。基本上它是单一源码文件加上其所含入的头文件。
- 所谓 s t a t i c static static对象,这种对象包括 g l o b a l global global对象、定义于 n a m e s p a c e namespace namespace作用域内的对象、在 c l a s s e s classes classes内、在函数内、以及在 f i l e file file作用域内被声明为 s t a t i c static static的对象。函数内的 s t a t i c static static对象被称为 l o c a l s t a t i c local\,static localstatic对象,其他对象被称为 n o n − l o c a l s t a t i c non-local\,static non−localstatic对象。
- 真正的问题是:如果某编译单元内的某个 n o n − l o c a l s t a t i c non-local\,static non−localstatic对象的初始化动作使用了另一个编译单元内的某个 n o n − l o c a l s t a t i c non-local\,static non−localstatic对象,后者可能未被初始化。因为C++对**“定义于不同编译单元内的 n o n − l o c a l s t a t i c non-local\,static non−localstatic对象”**的初始化次序并无明确定义
- 将每个 n o n − l o c a l s t a t i c non-local\,static non−localstatic对象搬到自己专属的函数内,这些函数返回一个
reference
指向它所含的对象。C++保证函数内的 l o c a l s t a t i c local\,static localstatic对象会在“该函数被调用期间”“首次遇上该对象之定义式”时被初始化。