一、概述
手工初始化内置类型对象
构造函数的成员初始化列表
static对象的初始化:包括non-local static和local static
二、细节
1. 你的构造函数使用了成员初始值列表了咩
不使用初始值列表:
class A {
public:
A(const string &s, int i)
{
//下面都是赋值,而非初始化
s = name;
score = i;
}
private:
string name;
int score;
};
使用初始值列表:
class A {
public:
A(const string &s, int i) :name(s), score(i) {}
private:
string name;
int score;
};
C++规定,对象的成员变量的初始化动作发生在进入构造函数体之前,即上面那个版本的各成员会先被默认初始化,然后才进入函数体执行赋值操作。
补充:如果成员变量是const或references,那它们一定要初始化,而不能赋值!
2. 不同文件里的non-local static对象的初始化顺序是未定义的
我们可以将每个non-local static对象用一个返回其引用的函数封装起来,这样它就像local static对象了,至少函数被调用时它会被初始化。