Effective C++ 规则04:确认对象使用前已被初始化

读取未初始化的值会导致不明确的行为。比如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对象。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值