effective c++(04)之对象使用前初始化
对于内置类型以外的初始化责任落在构造函数身上。如下:
class PhoneNumber{};
class ABEntry{
public:
    ABEntry( const string& name, const string& address, const list<PhoneNumber>& phones );
private:
    string theName;
    string theAddress;
    list<PhoneNumber> thePhones;
    int numTimesConsulted;
};
ABEntry::ABEntry( const string& name, const string& address, const list<PhoneNumber>& phones )
{
    theName = name;
    theAddress = address;
    thePhones = phones;
    numTimesConsulted = ;
}
以上对数据成员不是初始化,而是赋值。初始化发生在更早的时候,发生于这些成员的default构造函数被自动调用之时。
ABEntry::ABEntry( const string& name, const string& address, const list<PhoneNumber>& phones )
: theName(name),
theAddress(address),
thePhones(phones),
numTimesConsulted()
{}
以上这个通常效率要高,这次只调用了一次默认构造函数而没有使用赋值。
规则:总是在初值列中列出所有的成员变量,以免还要记住那些成员变量可以无需初值。
如果成员变量是const或者references,他们就一定需要初值而不能被赋值。最简单做法:总是使用成员初值列。
成员初始化次序:base classes更早于derived classes被初始化。class成员总是以其声明的次序被初始化(即privated中的次序)。
class FileSystem{
public:
    size_t numDisks() const;
};
extern FileSystem tfs;
class Directory{
    Directory( params);
};
Directory::Directory(params)
{
    size_t disks = tfs.numDisks();
}
Directory tempDir(params);
以上FileSystem和Directory属于不同的文件系统,tempDir在使用之前需要将tfs初始化。但是系统并不能保证其初始化,如何将tfs这个non-local static对象在被disks使用前进行初始化。方法:将每个non-local static对象搬到自己的专属的函数里面,返回一个reference指向所包含的对象。使得non-local static对象被local static对象所替代。解决方案如下:

总结:
1. 为内置类型对象进行手工初始化,因为c++不一定保证初始化他们;
2. 构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。初值列列出的成员变量,排列次序应该和声明次序相同;
3. 为免除“跨编译单元制初始化次序”问题,以local static对象替换non-local static对象。
effective c++(04)之对象使用前初始化的更多相关文章
- effective c++:尽量替换define,确保对象使用前初始化
		#define ASPECT_RATIO 1.653 名为ASPECT_RATIO的值在预编译阶段被替换成1.653,如果在这个常量上出现编译错误,我们可能会困惑1.653的值是什么意思,于是将因为跟 ... 
- 【Effective C++ 读书笔记】条款04:确定对象使用前已先被初始化
		永远在使用对象之前先将它初始化.对于无任何成员的内置类型,你必须手工完成此事. 至于内置类型以外的任何其他东西,初始化责任落在构造函数身上.规则很简单:确保每一个构造函数都将对象的每一个成员初始化. ... 
- Effective C++ -----条款04:确定对象被使用前已被初始化
		为内置型对象进行手工初始化,因为C++不保证初始化它们. 构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作.初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同. 为免 ... 
- 《Effective C++》——条款04:确定对象使用前已先被初始化
		读取未初始化的值会导致不明确的行为.在某些平台上,仅仅只是读取未初始化的值,就可能让你的程序终止运行.更可能的情况是读入一些“半随机”bits,污染了正在进行读取动作的那个对象,最终导致不可预知的程序 ... 
- 读书笔记 effective c++ Item4 确保对象被使用前进行初始化
		Item4 确保对象被使用前进行初始化 C++在对象的初始化上是变化无常的,例如看下面的例子: Int x; 在一些上下文中,x保证会被初始化成0,在其他一些情况下却不能够保证.看下面的例子: Cla ... 
- [effictive c++] 条款04 确定对象被使用前已被初始化
		成员初始化 在c和c++ 中,使用为初始化的类型经常会引发不可预料的错误,从而使得我们要花费巨大的时间用于调试查找问题,所以确定对象被使用前已被初始化是个非常好的习惯. 永远在使用之前对对象进行初始化 ... 
- Effective C++(4)   确定对象被使用前已先被初始化
		危害:读取未初始化的值会导致不明确甚至是半随机化的行为. 最佳处理办法:永远在使用对象之前先将它初始化:确保每一个构造函数都将对象的每一个成员初始化. 1 注意区分赋值和初始化: 从初始化的角度而言, ... 
- stack与heap、new的内存分配、static对象。(effective c++ 04)
		阅读effective c++ 04 (30页) 提到的static对象和堆与栈对象."不同编译单元内定义的non-local static对象". 了解一下. 目录 sta ... 
- C++内存管理(effective c++ 04)
		阅读effective c++ 04 (30页) 提到的static对象和堆与栈对象.看了看侯老师的内存管理视频1~3.有点深. 了解一下. 目录 1 内存管理 1.1 C++内存管理详解 1.1.1 ... 
随机推荐
- SQL server 2012序列号 注册码 z
			MICROSOFT SQL SERVER 2012 企业核心版激活码序列号: FH666-Y346V-7XFQ3-V69JM-RHW28 MICROSOFT SQL SERVER 2012 商业智能版 ... 
- malloc free 和new delete区别
			从网上看的学习之 1. malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符,与"+“.”-“.”*“.”/“有一样的地位. 2. new/delete是 ... 
- bzoj 1226 [SDOI2009]学校食堂Dining(状压DP)
			Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以 ... 
- 除去重复记录distinct
			在查询数据库时候,可以使用distinct关键字过滤重复记录 例如 SELECT distinct ShiftID FROM [AdventureWorks].[HumanResources].[Em ... 
- 【前端】CSS3实现弹出效果
			36氪这个网站上的登录框弹出的时候挺帅气的,想知道它是怎么做的 .. 今天通过问新爷再加上自己琢磨琢磨写出一个小小Demo - 上代码 <!DOCTYPE html> <html&g ... 
- HW2.25
			import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ... 
- ios:Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set?
			- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)laun ... 
- C#下的 Emgu CV
			Emgu CV下载地址 http://sourceforge.net/projects/emgucv/files/ 找最新的下就行了,傻瓜式安装,选择目录后自动完成安装,然后提示安装VS2008和VS ... 
- AMQP与QPID简介
			国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ... 
- 更改cmd语言(chcp)
			chcp 437 更改为英文 chcp 936 更改为简体中文 mode con cp select=437 mode con cp /status chcp cmd /c "chcp 43 ... 
