1.内置类型初始化
int x ;
在某些语境下x被初始化为0,在其他语境下不保证。
在某些平台甚至读取未初始化的值,就会停止运行。
2.自定义类型初始化
自定义类型的初始化责任落在,构造函数身上,构造函数要把对象的每一个成员都初始化。
不要混淆初始化和赋值
class PhoneNumber
{
public:
PhoneNumber(const string &name, const string &adress)//构造函数
{
theName = name;//赋值并非初始化
theAdress = adress;//赋值并非初始化
}private:
string theName;
string theAdress;
};
虽然这样仍然会得到你想要的初始值,并非是最佳做法。
C++规定,成员变量的初始化应该在进入构造函数之前。
构造函数最佳的做法,是用初始化列表替换赋值操作
class PhoneNumber
{
public:
PhoneNumber(const string &name, const string &adress)
:theName(name)
,theAdress(adress)
{}private:
string theName;
string theAdress;
};
第一版的代码,默认构造函数的初始化列表,已经将theName和theAdress,设置初值,然后又立刻为其赋新值,浪费了默认构造。
对于大多数类型,直接用初始化列表对其初始化,是比先初始化再赋值的效率更高的。
3.static对象初始化
某个A.cpp文件的非本地静态变量初始化,需要用到另一个B.cpp文件的非本地静态变量。
那么A.cpp所用的非本地静态成员变量可能是未初始化的,因为C++对不同编译单元的非本地成员变量初始化次序没有明确定义。
我们可以把用到的非本地静态成员变量,放在一个函数中,返回一个引用指向对象,换句话说把非本地的静态变量,替换为本地的静态变量。
class FileSystem
{
size_t numDisk() const;};
extern FileSystem tfs;
FileSystem &tfs()
{
static FileSystem fs;
return fs;
}