保持习惯,继续写博客。
条款04:确定对象被使用前已被初始化
C++未初始化的值会导致不明确的行为。
C++初始化采用成员初值列的做法比较高效。
class ABEntry
{
private:
std::string theName;
std::string theAddress;
std::list<PhoneNumber> thePhones;
int numTimesConsulted;
}
ABEntry::ABEntry()
:theName(),
theAddress(),
thePhones(),
numTimesConsulted(0)
{}
成员初始化次序:base classes 更早于其derived classes 被初始化,而class 的成员变量总是以其声明次序被初始化。所以改变成员初值列的顺序也不会改变其初始化的次序。
跨编译单元之初始化次序的问题:如果有至少2个源码文件,可以采用local static 来代替non-local static 对象
不可以的代码:
class FileSystem { //来自你的程序库
public :
...
std::size_t numDisks() const; //众多的成员函数之一
...
};
extern FileSystem tfs; //预备给客户使用的对象,tfs 代表“the file system”
class Directory{ //由程序库客户建立
public :
Directory(params);
...
};
Directory::Directory(params)
{
...
std::size_t disks = tfs.numDisks(); //使用tfs 对象
...
}
Directory temDir(params); //为临时文件而做出的目录
这样可能在temDir 初始化的时候tfs还未初始化。
local static做法:
class FileSystem{...}; //同前
FileSystem& tfs() //这个函数用来替换tfs对象,它在FileSystem class 中可能是个staitc
{
static FileSystem fs; //定义并初始化一个local static 对象
return fs; //返回一个reference 指向上述对象
}
class Directory{...}; //同前
Directory::Directory(params) //同前,但原本的reference to tfs 现在改为tfs()
{
...
std::size_t disks = tfs.numDisk();
...
}
Directory &tempDir() //这个函数用来替换tempDir对象
{ //它在Directory class 中可能是个static
static Directory td; //定义并初始化local static 对象
return td; //返回一个reference 指向上述对象
}
请记住:
为内置型对象进行手工初始化,因为C++不保证初始化它们。
构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。初值列列出的成员变量,其排序次序应该和它们在class 中的声明次序相同。
为免除“跨编译单元之初始化次序”问题,请以local static 对象替换 non-local static 对象。