C++改善_2016_11_28

#include <iostream>
using namespace std;

//rule04: Make sure that objects are initialized before they're used
//确定对象使用前已先被初始化

/*
对于无任何成员的内置类型,你必须手工完成此事
至于内置类型以外的任何其他东西。初始化责任落在构造函数身上。
规则很简单:确保每一个构造函数都将对象的每一个成员初始化。
这个规则很容易奉行,重要的是别混淆了赋值(assignment)和初始化(initialization). 

*/ 

class PhoneNumber{...};
class ABEntry{             //ABEntry = "Address Book Entry
public:
	ABEntry(const std::string &name, const std::string &address,
			const std::list<PhoneNumber>& phones);
private:
	std::string theName;
	std::string theAddress;
	std::list<PhoneNumber> thePhones;
	int numTimesConsulted;		
};

ABEntry::ABEntry(const std::string &name, const std::string &address,
			const std::list<PhoneNumber>& phones)
{
	theName = name;                //这些都是赋值而非初始化 
	theAddress = address;
	thePhones = phones;
	numTimesConsulted = 0 ;
}

//这符合你的期望,但不是最佳的 
//C++规定。对象的成员变量的初始化动作发生在进入构造函数本体之前

//较佳的写法
ABEntry::ABEntry(const std::string &name, const std::string &address,
			const std::list<PhoneNumber>& phones)
	: theName(name),			//这些都是初始化 
	  theAddress(address),
	  thePhones(phones),
	  numTimesConsulted(0)
	{} 
	
/*
	虽然最终结果相同,但效率更高。给予赋值的那个版本会先调用default构造函数设初值然后立刻在赋值,
	default构造函数的一切作为因此被浪费了。
	成员初值列的做法避免了这一问题。 
*/ 

ABEntry::ABEntry()
	: theName(),
	  theAddress(),
	  thePhones,
	  numTimesConsulted(0)
	{}
	
我们规定总是在初值列种列出所有的成员变量,以免还得记住那些成员变量可以无需初值。


//在第一个文件中,某个库 
class FileSystem{
public:
	...
	std::size_ numDisks() const;
}; 
extern FileSystem tfs; //预备给客户使用的对象 tfs: the file system
 
 
//假设客户建立了一个class用以处理文件系统内的目录。
class Directory{
public:
	Directory(params);
	...
}; 

Directory::Directory(params)
{
	...
	std::size_t disks = tfs.numDisks();
	...
}

Directory tempDir(params);

//无法确定tfs会在tempDir之前先被初始化

=>这样做
FileSystem& tfs()
{
	static FileSystem fs;
	return fs;
 } 
 
Directory::Directory(params)
{
	...
	std::size_t disks = tfs().numDisks();
	...
} 
 

 
Directory &tempDir()
{
	static Directory td;
	return td;
}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值