本质上,你是正确的,但不应将成员初始值设定项视为与构造函数分开。初始化程序是构造函数的一部分,并在构造函数的主体之前调用。
当您声明内置类型的自动变量时,它既是定义也是声明。这是一个声明,因为标识符绑定到一个类型,并且它是一个定义,因为编译器为它分配存储空间。
int var1; // declares/defines var of type int
int var2 = 0; // declares/defines a var of type int and initializes it to 0
初始化程序在定义初始值时设置初始值,但在初始化程序之前已经定义初始值。
int x = 5;
int y = 5;
int main()
{
int x = x; // x is undefined here not 5 because x refers to itself
int y[y];
int size = sizeof(y)/sizeof(int); // size is 5 (y[5]) since y isn't defined until after the enclosing bracket so y referred to the global y in the declaration.
}
有一些变量必须然而初始化。常量和参考。
这与构造函数相同。成员的定义就在委员会主体之前。这是调用构造函数时成员和基础的定义顺序。
- 虚基类
- 基类
- 部件 - 在它们被宣布
- 构造函数体执行
离开构造体后的顺序,一切都已初始化。
如果你不使用初始值设定项,那么你可以假定它已经在进入ctor体时已经定义了,但是你不能认为它有任何特定的值。同样,常量和引用必须在成员初始化程序中初始化。
“什么是初始化列表?”一个用词不当。你在谈论'ctor-initializer'。初始化器列表完全是其他东西。 –
@Amar - 'int a [] = {1,2,3,4,5};' - '{1,2,3,4,5}'是初始化列表。 – Mahesh
我的意思是构造函数初始化列表; like sample :: sample:A(a)() – Amar