Effective C++ 条款04

本文详细讲解了在C++编程中如何确保对象在使用前正确初始化,包括内置类型和自定义类型的初始化方法,以及成员变量的初始化顺序、const和reference成员的处理。还提到了避免跨编译单元初始化问题的解决方案,如使用localstatic对象替代non-localstatic对象。

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

  • 最佳的处理办法是:永远在使用对象之前将它初始化。

1.内置类型手工完成
2.自定义类型通过构造函数完成
注意:不要混淆了赋值(assignment)和初始化(initialization)

  • 对象的成员变量的初始化动作发生在进入构造函数本体之前(对象的默认构造函数将被调用)

用member initialization list(成员初值列)替换赋值动作

使用成员初值列调用对象的拷贝构造函数进行初始化,效率高于先调用默认构造函数再进行赋值的操作

Default构造函数也可以使用成员初始列构造——指定无物(nothing)作为初始化实参,例子如下:

Widget::Widget()
    :theName(),//std::string
     theAddress(),
     thePhones(),
     numTimesConsulted(0){}

注意:使用成员初值列时列出所有成员变量(包括内置数据类型),避免遗漏

以下两种情况必须使用初值列(赋值会报错):

1.成员变量是const
2.成员变量是references

成员初始化次序

  • base classes更早于其derived classes被初始化
  • class的成员变量总是以其声明次序被初始化(无论他们在初值列中的出现次序)
    因此初值列中成员出现次序最好为他们的声明次序

不同编译单元内定义的non-local static对象的初始化次序

non-local static对象:函数内的static对象称为local static对象(因为他们对函数而言是local),其他static对象称为non-local static对象

编译单元: 指产出单一目标文件的那些源码

C++对“定义于不同编译单元内的non-local static 对象”的初始化相对次序并无明确定义,因此可能会出现一个单元内的non-local static 对象使用了另一单元内未初始化的non-local static对象的问题

解决办法:将每个non-local static对象搬到自己的专属函数内(该对象在此函数内被声明为static),这些函数返回一个reference指向它所含的(static)对象。——即将non-local static对象通过函数用local static对象替换。(Singleton模式)

Widget&widget(){
	static Widget m_widget;
	return m_widget;
}

请记住:
1.为内置型对象进行手工初始化,因为C++不保证初始化它们。
2.构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同。
3.为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象(通过reference-returning函数)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值