条款04:确定对象被使用前已先被初始化

结论1:为内置型对象进行手工初始化,因为C++不保证初始化它们。对于内置类型以外的其它类型,初始化责任落在构造函数,确保每一个构造函数都将对象的每一个成员初始化。

结论2:构造函数最好使用成员初始化列表,而不要在构造函数本体内使用赋值操作。

因为对于内置类型以外的其它类型,在构造函数本体内使用赋值操作需要先自动调用default构造函数,再对它们赋予新值,相对来说,初始化列表方法只是以初始化列表的值为实参调用copy构造,更加高效;对于内置类型,初始化列表方法与赋值方法并无差别,为了一致性最好也通过成员初始化列表来初始化。初始化列表中列出的成员变量,其排列次序应该和它们在class中的声明次序相同。

结论3:为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象。

编译单元指产出单一目标文件的源码,static对象其寿命从被构造出来直到程序结束为止,包括global对象,定义于namespace作用域内的对象,在classes内,在函数内,以及在file作用域内声明为static的对象,函数内的static对象称为local static对象,其它对象称为non-local static对象。

因为C++对定义于不同编译单元的non-local static对象的初始化次序并无明确定义,当不同编译单元的non-local static对象的初始化存在次序关系时,可以将每一个non-local static对象搬到自己的专属函数内,该对象在此函数内声明为static,这些函数返回一个reference指向它所含的对象,然后用户直接调用这些函数,而不直接指涉这些对象。采用这种方法是因为C++保证,函数内的local static对象会在该函数被调用期间首次遇上该对象之定义式时被初始化,所以如果以函数调用(返回一个reference指向local static对象)替换直接访问non-local 对象,可以保证对象之间的初始化次序关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值