#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;
}
C++改善_2016_11_28
最新推荐文章于 2022-05-31 17:02:22 发布