[effictive c++] 条款04 确定对象被使用前已被初始化
来源:互联网 发布:js渲染 编辑:程序博客网 时间:2024/05/17 22:23
成员初始化
在c和c++ 中,使用为初始化的类型常常会引发不可预料的错误,从而使得我们要花费巨大的时间用于调试查找问题,所以确定对象被使用前已被初始化是个很好的习惯。
永远在使用之前对对象进行初始化。对于无任何成员的内置类型,你必须手工完成初始化操作。因为c++不保证初始化他们。
内置类型意外的其他东西,初始化责任落在构造函数身上。但要注意区分构造函数中的变量是赋值还是初始化。举个例子
class PhoneNumber{...};class ABEntry{public:ABEntry(const std::string &name, const strd::string& address, const std::list<PhoneNumber>& phones);private:std::string theName;std::string theAddress;std::list<PhoneNumber> thePhones;int numTimesConsulted;};ABEntry::ABEntryconst std::string &name, const strd::string& address, const std::list<PhoneNumber>& phones){theName = name;//这些都是赋值theAddress = address;//而非初始化thePhones = phones; //注意区分numTimesConsulted = 0;}
上述构造函数中的变量是赋值,而非初始化。这么做可以使得变量是你期望的数值,但这并不是一个好的做法。那么如何判断是赋值和初始化呢?c++规定,变量的初始化应在进入构造函数体之前。所以上面的构造函数先对各个变量执行了default初始化,然后又对变量进行了赋值。(ps:内置类型 变量不保证一定在赋值动作前获得初指)
ABEntry构造函数一个极好的写法是用member initialization list(成员初值列表),具体如下:
ABEntry::ABEntryconst std::string &name, const strd::string& address, const std::list<PhoneNumber>& phones):theName(name),theAddress(address),thePhones(phones),numTimesConsulted(0){}
这个版本的构造函数是在进入构造函数之前进行了初始化,构造函数体内则无需在进行赋值。这样就省去了赋值操作的开销,效率通常更高。为什么我这里用"通常"更高? 因为内置类型如numTimesConsulted ,其初始化和赋值的代价相同,为了一致性,通常将其也用成员初值列表初始化。
有些情况下,即使变量属于内置类型也一定要用成员初值列表,例如成员变量是const或references,他们不能被赋值,只能被初始化。
classes拥有多个构造函数,且每个构造函数都有自己的成员初值列表时怎么办?
如果classes存在许多成员变量或base classes , 会导致许多重复的初值列,同时也加重了开发人员的工作。这种情况下可以在初值列中遗漏那些“赋值像初始化一样好”的成员变量,改为赋值操作,并将赋值操作移往某个函数内(通常是private 函数),供所有构造函数使用。这样就可以省去很多无谓的重复劳动。
成员初始化次序
下面我们来说一说成员初始化的次序。c++中成员初始化的次序总是相同的:base classes早于derived classes被初始化,class成员总是按照声明次序进行初始化。所以为了避免不必要的麻烦,成员初值列的顺序最好与声明顺序一致。
总结
- 为内置对象进行手工初始化,因为c++不保证初始化他们
- 构造函数使用成员初值列,而不要在构造函数本体内使用赋值操作,初始列列出变量的顺序应该和他们在class中生命顺序一致。
参考自《effictive c++ 》
3 0
- [effictive c++] 条款04 确定对象被使用前已被初始化
- Effective C++:条款04:确定对象被使用前已先被初始化
- [Effective C++]条款04 确定对象被使用前已先被初始化
- 条款04:确定对象被使用前已被初始化
- 条款4:确定对象被使用前已被初始化
- 条款04:确定对象被使用前已先被初始化
- 条款04:确定对象被使用前已先被初始化
- 条款04:确定对象被使用前已先被初始化
- 条款04 确定对象被使用前已先被初始化
- 条款04:确定对象被使用前已先被初始化
- 条款04:确定对象被使用前已先被初始化
- 《Effective C++》学习笔记条款04 确定对象被使用前被初始化
- 《Effect C++》学习------条款04:确定对象被使用前以先被初始化
- 读书笔记《Effective C++》条款04:确定对象被使用前已先被初始化
- 条款04:确定对象被试用前已被初始化
- Effective C++条款4:确定对象使用前已被初始化
- 条款4、确定对象在使用前已被初始化
- 条款4:确定对象被使用前已经被初始化
- 架构设计—又见架构之SOA
- 函数指针与回调函数
- java将汉字转换为全拼及返回中文的首字母
- rman备份与还原
- jsp基础
- [effictive c++] 条款04 确定对象被使用前已被初始化
- gps
- Android发送短信的病毒程序
- CNKI学者成果库
- 依然还记得四年前的这个季节,金秋九月,满校园的桂花飘香
- Maven学习 (一) 搭建Maven环境
- ios 8地图定位服务问题
- Android学习笔记之ContentProvider自定义
- 15 分钟掌握 15 个 Docker 小窍门