列表初始化(list initialization)
注:对于内置类型的变量,如果使用列表初始化且初始化存在丢失信息的风险,则编译器将报错。
|
|
默认初始化(default initialization)
如果定义变量时没有指定初值,则变量被默认初始化,具体值由变量类型决定。对象被默认初始化时自动执行默认构造函数。
何时发生
- 当在块作用域中不使用任何初始值定义一个非静态变量或者数组时;
1 2 3 4
int main() { int a; double b[10]; }
- 当一个类本身含有类类型的成员且使用合成的默认构造函数时;
1 2 3 4 5 6 7 8
class A { public: int a; }; class B { public: A a; };
- 当类类型的成员没有在构造函数初始值列表中显示地初始化时。
1 2 3 4 5 6 7
class A { public: A(int a) : a_(a) {} private: int a_; int b_; };
值初始化
对于内置类型,则元素初始值自动设为0;如果是类类型,则由类来默认初始化。
何时发生
- 在数组初始化时,提供的初始值的数量少于数组的大小;
1
int arr[5] = {1, 2, 3}; // a[] = {1, 2, 3, 0, 0}
- 不使用初始值定义一个局部静态变量时;
1 2 3 4
int func() { static int s; // s值为0 return 0; }
- 使用
T()
来显示地请求值初始化时; - 使用列表初始化来初始化聚合类,列表中元素数量少于类的成员数量时,后续成员被值初始化。
|
|