执行分两个阶段进行:执行在C构造++构造的
初始化阶段
机构执行其由构造的主体内的所有语句的相位。请注意,类类型的数据成员始终在初始化阶段初始化,而不管成员是否在构造函数初始化程序列表中显式初始化。初始化发生在构造函数主体的任何语句执行之前。
让我们考虑由构造初始化类学生的一个实例的方式 -
Student(string &fn, string &ln, int i, int y = Freshman)
: first_name(fn)
, last_name(ln)
, id(i)
, year(y)
{}
这是另一种,但做的“低效率”和“不雅”的方式同 -
Student(string &fn, string &ln, int i, int y = Freshman)
{
first_name = fn;
last_name = ln;
id = i;
year = y;
}
此构造中日新的代码(上面的代码)指定Student类的成员。它没有明确地初始化它们。无论是否有明确的初始化程序,first_name和last_name成员甚至在执行构造函数之前都被初始化。此构造函数隐式使用默认的字符串构造函数来初始化first_name和last_name成员。当构造函数的主体执行时,first_name和last_name成员已经具有值。这些值被构造函数体内的赋值覆盖。
所以,这意味着通过执行到达构造的开口支架的时候,这是条件 -
- “如first_name”,这是一个串是通过调用初始化默认字符串构造函数(编译器'生成')。
- “姓氏”,这是一个字符串是通过调用默认字符串的构造函数(一个“使得”,其编译器)初始化。
- 'id',这是一个整数是未初始化。
- 'year',这是一个整数是未初始化。
而现在,很明显,在分配完成每四个变量,在构造函数体。
我对这件事的理解是对的吗?我不知何故觉得我失去了一些东西。
而且在使用的初始化列表,是默认的构造函数(其中一个编译器使我们),被称为与我们的参数传递(在串的情况下)和初始化完成,如“INT id = i;“在id(i)的情况下?
PS:大部分的报价都是从这个链接 -
http://www.bogotobogo.com/cplusplus/constructor.php
@ Seth,谢谢你的回复。如果我删除** const **关键字(为了简化情况),您可以评论一下这个场景吗? – jsp99
@Appy那么你在所有账户上都是正确的。 –
@Appy进行了更新:您不能让'const'成员未初始化。 +1给Kerrek。 –