12-6初始化列表

初始化列表

初始化列表:初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段(变量名+(初始化值))

案例

class Foo
{
private:
string name ;
int id ;
public:
Foo(string s, int i):name(s), id(i){} ; //声明中的初始化列表
};

注:类成员的初始化顺序与初始化列表的顺序无关,与类里面属性定义的顺序有关

类之间初始化顺序:

父类构造函数–>成员类对象构造函数(按照类定义顺序而不是初始化列表的顺序)–>类自身构造函数

类本身初始化覆盖顺序

先进行声明时初始化,然后进行初始化列表初始化,最后进行构造函数初始化。即初始化列表初始化的变量值会覆盖掉声明时初始化的值,而构造函数中初始化的值又会覆盖掉初始化列表的

案例

 1 #include "stdafx.h"
2 #include <iostream>
3 using namespace std;
4 class A
5 {
6 public:
7 int a = 1; //声明中初始化(c++11)
8 A() {}
9 A(int a_):a(a_){} //列表初始化(覆盖声明初始化)
10 A(int a_, bool b) :a(4) { a = a_; } //构造函数中初始化(全部覆盖)
11 };
12
13 int main()
14 {
15 A a1, a2(3), a3(5, true);
16 cout << "a1.a=" << a1.a << endl;
17 cout << "a2.a=" << a2.a << endl;
18 cout << "a3.a=" << a3.a << endl;
19 system("pause");
20 return 0;
21 }

/*
结果为:
a1.a=1
a2.a=3
a3.a=5
*/