类的变量的初始化分为成员初始化列表、就地初始化。
成员初始化列表是C++中构造函数的一部分,它允许你在进入构造函数体之前为类的成员变量提供初始值。成员初始化列表紧跟在构造函数的参数列表之后,由冒号 : 开始,然后是一系列以逗号分隔的初始化项。
就地初始化(也称为成员初始器或直接初始化)是指在类或结构体的成员变量声明时直接给它们赋初值。
就地初始化(也称为成员初始器或直接初始化)是在对象创建时发生的,它在构造函数体执行之前就已经完成了。具体来说,在C++中,成员变量的初始化遵循以下顺序:
-
成员初始化列表:如果构造函数使用了成员初始化列表,那么这些成员会按照它们在类中声明的顺序进行初始化,而不是按照初始化列表中的顺序。
-
就地初始化:对于那些没有在成员初始化列表中显式初始化的成员变量,如果它们已经在声明时进行了就地初始化,那么它们会在构造函数体执行之前被赋予这些默认值。
-
构造函数体:最后,构造函数体内的代码会被执行。
因此,可以这样理解就地初始化的过程:
- 当一个对象被创建时,编译器首先检查每个成员变量是否在构造函数的成员初始化列表中有对应的初始化。
- 如果某个成员变量没有出现在成员初始化列表中,但已经定义了就地初始化,则该成员变量会被赋予就地初始化提供的值。
- 所有成员变量初始化完成后,才会开始执行构造函数体内的语句。
举个例子,假设有一个结构体如下:
cpp
struct Example
{
int a = 42; // 就地初始化
std::string b; // 没有就地初始化
Example(int x) : b("Hello") // 成员初始化列表
{
// 构造函数体
}
};
在这个例子中,Example
对象的创建过程如下:
a
被就地初始化为42
。b
在成员初始化列表中被初始化为"Hello"
。- 然后构造函数体被执行。
所以,就地初始化发生在构造函数体执行之前,并且是按照成员变量在类中声明的顺序来完成的。如果成员变量也在成员初始化列表中被初始化,那么成员初始化列表中的初始化将覆盖就地初始化。