Effective C++:条款04
2011-11-10 22:17
232 查看
Effective C++:条款04:确定对象被使用前已先被初始化 (Make sure that objects are initialized before they're used.)
为内置型对象进行手工初始化,因为C++不保证初始化它们。
构造函数最好使用成员初值列(member initialization list),而不要在构造函数本体内使用赋值操作(assignment)。初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同。
为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象
我自己在写代码的时候也经常会遇到忘记初始化某对象的问题,而且这些错误比较难 以调试,Meyers提出了一些避免这些错误的解决方法:
1.手工初始化所以内置类 型:
这一条很好理解,对于int,enum等内置类型,在使用前一定要初始化。
2.对于类类型等用户自定义的对象,使用成员初值列初始化所有的对象:
1 using namespace std; 2 3 class PhoneNumber{}; 4 class Customer 5 { 6 public: 7 Customer(const string& name, const string& address, 8 const PhoneNumber& phone); 9 private: 10 string theName; 11 string theAddress; 12 PhoneNumber thePhone; 13 int usedTimes; 14 }
对于Customer 类的构造函数定义,一般我们会这么写:
1 Customer::Customer(const string& name, const string& address, const PhoneNumber& phone) 2 { 3 theName = name; //这些都是赋值 4 theAddress = address; //而不是初始化 5 thePhone = phone; 6 usedTimes = 0; 7 }
可是,在c++中,对不是内置型的对 象的初始化都发生在进入构造函数之前,也就是说,在进行theName = name;赋值之前, theName就已经进行了初始化了,这个过程调用自己的默认构造函数。
紧接着有立 刻进行了赋值操作,这样会造成额外的浪费,所以我们可以这样写构造函数:
1 Customer::Customer(const string& name, const string& address, const PhoneNumber& phone) 2 :theName (name),//成员初始化列 3 theAddress(address), 4 thePhone(phone), 5 usedTimes(0)//内置类型也一并初始化 6 { 7 }
使用了成员初始化列的方法,在进入构造函数体之前就进行了初始 化,减少了赋值的开销,同时为了保持一致性,将内置类型也一并进行了初始化。
还有一点要记住:在成员初始化列中对变量的初始化次序是按照变量声明的次序 的,也就是说,即使将上面的次序任意改变,也改变不了初始化次序,所以我们要尽可能 地按照使用的顺序来声明变量!
3.在多个编译单元内的non-local static对象的 初始化次序问题:
non-local static对象表示在程序执行过程中一直存在的对象 ,像类中声明的static变量,全局变量,而在普通函数中声明的static变量称为local static变量。
那么当有多个不同的编译单元(即存在于不同的文件中)时,对这 些non-local static对象的初始化次序,在c++中,是不确定的,而且也没法确定!
当两个或多个文件中的non-local static对象发生关联时,问题就出现了。
解决方法就是使用了设计模式中的:Singleton单件模式,将对non-local static 的访问移到函数中,将其转变为local static变量,确保其被初始化了再使用。
如果是多个non-local static对象互相之间都有关联,那。。对不起,是设计出了问题。
相关文章推荐
- Effective C++ 条款04确定对象被使用前已被初始化
- 《Effective C++ 3》04 设计与声明 条款:18-25
- Effective C++:条款04:确定对象被使用前已先被初始化
- 《Effective C++》——条款04:确定对象使用前已先被初始化
- effective C++ 条款01 to 条款04
- 读书笔记《Effective C++》条款04:确定对象被使用前已先被初始化
- [Effective C++]条款04:确定对象被使用前已先被初始化
- Effective C++学习笔记 条款04:确定对象被使用前已先被初始化
- Effective C++_笔记_条款04_确定对象被使用之前已先被初始化
- 读书笔记《Effective c++》 条款04 确定对象被使用前已经被初始化
- 《Effective C++》条款04总结
- Effective c++ 学习笔记——条款04:确定对象被使用前已先被初始化
- [Effective C++]条款04 确定对象被使用前已先被初始化
- Effective C++学习4 条款04:确定对象在被使用前以被初始化
- 《Effective C++ 3》01 让自己习惯C++ 条款:01-04
- Effective C++ 条款04:确定对象被使用前已经先被初始化
- 《Effective C++》学习笔记条款04 确定对象被使用前被初始化
- 【Effective C++ 读书笔记】条款04:确定对象使用前已先被初始化
- effective c++ 条款 04 (对象初始化)整理
- Effective C++ -----条款04:确定对象被使用前已被初始化