Effective C++ 条款4 确定对象被使用前已被初始化

条款4 确定对象被使用前已被初始化

1. 对于内置类型,如果变量在全局作用域内定义,默认初始化为0,如果变量在局部作用域内定义,默认不进行初始化;

对于类类型,默认调用默认构造函数进行初始化,如果没有默认构造函数,则必须显式初始化.

2. 构造函数对成员进行初始化的动作发生在初始化列表中而不是函数体内,在函数体内进行的"初始化"实际上是赋值,对于类类型,降低了程序效率,对于内置类型在初始化列表还是在函数体内初始化对于效率没有影响,但在某些特殊情况(例如const变量和引用)必须在初始化列表进行初始化.

3. 类类型的构造函数对于成员按:基类成员→派生类类类型成员(按声明顺序)→派生类内置类型成员(按声明顺序)的顺序进行初始化.

4. 对于多文件程序,"C++对于定义于不同编译单元内的non-local static对象"(static对象指"寿命从被构造出来直到程序结束为止"的对象,包括global对象,定义域namespace作用内的对象,在class内,在函数内,以及在文件作用域内被声明为static的对象,函数内的static对象被称为local static对象,其他被称为non-local static对象)的初始化次序并无明确定义,因此如果一个文件内的non-local static对象的初始化有另一个文件中的一个non-local static对象的值决定,由于它们的初始化次序没有明确定义,那么可能出现后者在被初始化之前就被前者使用的情况从而印发错误,解决方法之一将non-local static对象放到函数内(这个对象被声明为static),这个函数返回一个refrence指向它所含的对象,然后用户调用这些函数而不是直接涉及这些对象,也就是是采用local static对象代替non-local static对象,这个手法的基础在于:C++保证,函数内的local static对象会在"该函数被调用期间"“首次遇上该对象之定义式"时被初始化.因而可以保证调用函数所获得的的reference必然指向一个已经初始化的对象.

    注:对于static对象,不同地方定义有些许差别(主要纠结于global对象是否为静态对象,从生存期来看,全局对象的生存期和静态对象的生存期相同,从作用域来看,全局对象作用于多文件而文件作用域内被声明为static的对象只作用于本文件),以下两个地址可以加深对作用域和静态对象的理解:

请记住

为内置型对象进行手工初始化,以为C++不保证初始化它们

构造函数最好使用成员初值列,而不要在构造函数本体内用赋值操作。初始列列出的成员变量,其排列次序应该和它们在class中的声明次序相同

为免除跨编译单元之初始化次序问题,请以local static对象替换non-local static对象


猜你喜欢

转载自blog.csdn.net/yuleidnf/article/details/80955611