构造函数的执行分两个阶段完成:
初始化阶段
正文执行阶段,由构造函数体内的所有语句组成.请注意,类型的数据成员始终在初始化阶段初始化,无论该成员是否在构造函数初始化列表中显式初始化.初始化发生在构造函数体的任何语句执行之前.
让我们考虑一种通过构造函数初始化类学生实例的方法-
Student(string &fn, string &ln, int i, int y = Freshman)
: first_name(fn)
, last_name(ln)
, id(i)
, year(y)
{}
Run Code Online (Sandbox Code Playgroud)
这是另一种,但"低效"和"不优雅"的做法 -
Student(string &fn, string &ln, int i, int y = Freshman)
{
first_name = fn;
last_name = ln;
id = i;
year = y;
}
Run Code Online (Sandbox Code Playgroud)
新代码中的此构造函数(上面的代码)分配类Student的成员.它没有明确初始化它们.是否存在显式初始值设定项,即使在执行构造函数之前,也会初始化first_name和last_name成员.此构造函数隐式使用默认字符串构造函数来初始化first_name和last_name成员.执行构造函数的主体时,first_name和last_name成员已具有值.这些值将被构造函数体内的赋值覆盖.
所以,这意味着当执行到达构造函数的开始括号时,这就是条件 -
现在,很明显,在构造函数的主体中对四个变量中的每个变量进行了赋值.
我对这件事的理解是对的吗?我不知何故觉得我错过了什么.
此外,在使用初始化列表,是默认的构造函数(其中一个编译器让我们),被称为与我们的参数传递(在案件串)和初始化完成,如"诠释的id = I;"在ID的情况下(一世) ??
PS:大多数报价均来自此链接 -
您的理解大多是正确的,除非您必须在初始化程序中初始化const成员,因为您无法const在构造函数的主体中或其他任何地方分配它们(因为它们).如果您尝试保留const未初始化的成员,则会出现编译错误.
是的,在初始化列表中,调用与您提供的参数匹配的对象的构造函数.如果没有参数(例如: blah()),则调用默认构造函数.
另外,在某些情况下,您绝对必须使用初始化列表(它不是可选的),例如
const成员时