读取未初始化的值会导致不明确的行为。比如int a;在有些环境中会被初始化为0,有些环境则不会。对于内置类型,C part of C++默认创建的是随机值。而non-C parts of C++不能则不是。这就是为什么array(C part of C++部分)不保证其内容被初始化,而vector(non-C parts of C++)保证。
至于内置类型以外的其他东西,初始化责任落在构造函数身上。规则很简单:确保每一个构造函数都将对象的每一个成员初始化。
需要区分赋值操作和初始化操作的不同。在C++构造函数体内的是赋值,初始化完成在进入函数体内之前。在函数体内的赋值操作是先调用default构造函数为成员变量设初值,然后立刻再对他们赋予新值。default构造函数的一切作为因此浪费了。使用成员初始化列表进行赋值避免了这一问题。对于内置类型的数据时候初始化和赋值的成本相同,但是为了一致性最好也通过成员初始化列表进行初始化。
有些情况必须使用成员初始化列表进行初始化,因为像const类型变量和引用必须初始化而不能赋值。
成员初始化列表是按照次序成员变量的声明次序进行初始化的。这和成员变量在初始化列表中的顺序无关,为了避免疑惑,通常以成员变量的声明次序为列表的次序。
为了解决“跨编译单元初始化次序”问题,请以local static对象替换non-local static对象。
Effective C++ 规则04:确认对象使用前已被初始化
最新推荐文章于 2021-07-12 16:54:00 发布