對於const和reference類型成員變量,它們只能夠被初始化而不能做賦值操作,因此只能用初始化列表。
還有一種情況就是,類的構造函數需要調用其基類的構造函數的時候。請看下面的代碼:
1 #include <iostream>
2 using namespace std;
3
4 class A //A是父類
5 {
6 private:
7 int a; //private成員
8 public:
9 A() {}
10 A(int x):a(x) {} //帶參數的構造函數對a初始化
11 void printA() //打印a的值
12 {
13 cout << "a = " << a << endl;
14 }
15 };
16
17 class B : public A //B是子類
18 {
19 private:
20 int b;
21 public:
22 B(int x, int y) : A(x) //需要初始化b以及父類的a
23 {
24 //a = x; //a爲private,無法在子類被訪問,編譯錯誤
25 //A(x); //調用方式錯誤,編譯錯誤
26 b = y;
27 }
28 void printB() //打印b的值
29 {
30 cout << "b = " << b << endl;
31 }
32 };
33
34 int main()
35 {
36 B b(2,3);
37
38 b.printA(); //調用子類的printA()
39 b.printB(); //調用自己的printB()
40
41 return 0;
42 }
從上面的程序可以看到,如果在子類的構造函數中需要初始化父類的private成員,直接對其賦值是不行的(代碼24行),只有調用父類的構造函數才能完成對它的初始化。但在函數體內調用父類的構造函數也是不合法的(代碼25行),只有採取22行中的初始化列表調用子類構造函數的方式。程序的執行結果如下:
1 a = 2
2 b = 3
當類中含有const、reference成員變量以及基類的構造函數都需要初始化列表。