[effictive c++] 条款04 确定对象被使用前已被初始化
成员初始化
在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++ 》
[effictive c++] 条款04 确定对象被使用前已被初始化的更多相关文章
- Effective C++ -----条款04:确定对象被使用前已被初始化
为内置型对象进行手工初始化,因为C++不保证初始化它们. 构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作.初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同. 为免 ...
- Effective C++ 条款四 确定对象被使用前已被初始化
1.对于某些array不保证其内容被初始化,而vector(来自STL)却有此保证. 2.永远在使用对象前初始化.对于无任何成员的内置类型,必须手工完成. int x = 0; c ...
- EC读书笔记系列之2:条款4 确定对象被使用前已先被初始化
条款4:确定对象被使用前已先被初始化 记住: ★为内置对象进行手工初始化,因为C++不保证初始他们 ★构造函数最好使用初始化列表,而不要在构造函数本体内使用赋值操作.初始化列表列出的成员变量,其排列次 ...
- 条款4:确定对象被使用前已被初始化(Make sure that objects are initialized before they're used)
其实 无论学何种语言 ,还是觉得要养成先声明后使用,先初始化再使用. 1.永远在使用对象之前先将其初始化. 内置类型: 必须手工完成. 内置类型以外的:使用构造函数完成.确保每一个构造函数都将对象的一 ...
- NO.4: 确定对象被使用前已被初始化
1.为内置对象进行 "手工初始化",因为C++不保证初始化他们(内置类型在赋值与初始化销毁基本相同,最好还是进行初始化列表),在内置类型过多情况下,可选择private函数统一初始 ...
- [Effective C++ --009]确定对象被使用前已先被初始化
在确保对象在使用前已先被初始化这一条款的编码实践中,作者为我们总结了三条经验,它们分别是: ------------------------------------------------------ ...
- Effective C++ 之 Item 4:确定对象被使用前已先被初始化
Effective C++ Chapter 1. 让自己习惯C++ (Accustoming Yourself to C++) Item 4. 确定对象被使用前已先被初始化 (Make sure th ...
- Effective C++_笔记_条款04_确定对象被使用之前已先被初始化
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 读取未初始化的值会导致不确定的行为.在某些平台上,仅仅只是读取为 ...
- Effective C++(4) 确定对象被使用前已先被初始化
危害:读取未初始化的值会导致不明确甚至是半随机化的行为. 最佳处理办法:永远在使用对象之前先将它初始化:确保每一个构造函数都将对象的每一个成员初始化. 1 注意区分赋值和初始化: 从初始化的角度而言, ...
随机推荐
- 【51Nod 1222】最小公倍数计数
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1222 求\([a,b]\)中的个数转化为求\([1,b]\)中的个数减去 ...
- 数据准备<4>:变量筛选-理论篇
在上一篇文章<数据准备<3>:数据预处理>中,我们提到降维主要包括两种方式:基于特征选择的降维和基于维度转换的降维,其中基于特征选择的降维通俗的讲就是特征筛选或者变量筛选,是指 ...
- bzoj 3252: 攻略
3252: 攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>, ...
- hdu 4857 逆向建图+拓扑排序 ***
题意:糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行.现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平等的,这些人有的穷有 ...
- java集合之二(collection架构)
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308513.html 首先,我们对Collection进行说明.下面先看看Collection的一些框架 ...
- Problem F: 铺地砖
Description 元旦过去了,新年大酬宾活动也已经告一段落了.陈盖历望着堆在仓库的瓷砖,很无聊的他把这些瓷砖裁成很多1X1 1X2 1X3的小瓷砖,然后他把这些小瓷砖排在地上画的一个1*n的长方 ...
- Null 和 Undefined
在JavaScript中存在这样两种原始类型:Null与Undefined.这两种类型常常会使JavaScript的开发人员产生疑惑,在什么时候是Null,什么时候又是Undefined? Undef ...
- Java的Spi机制心得
Java spi : 是Java EE 给服务供应商提供的接口,供应商遵循接口契约提供自己的实现.. 简单来讲就是为某个接口寻找服务实现的机制. 在看JDBC源码当看到DriverManage.get ...
- Extjs GridPanel 监听事件 行选中背景
Extjs设置GridPanel选中行背景色和选中单元格背景色 var view = grid.getView(); view.getRow(index).style.backgroundColor ...
- Selenium2+python自动化29-js处理多窗口
前言 在打开页面上链接的时候,经常会弹出另外一个窗口(多窗口情况前面这篇有讲解:Selenium2+python自动化13-多窗口.句柄(handle)),这样在多个窗口之间来回切换比较复杂,那么有没 ...