有哪幾種情況只能用intialization list 而不能用assignment

無論是在構造函數初始化列表中初始化成員,還是在構造函數體中對它們賦值,最終結果都是相同的。不同之處在於,使用構造函數初始化列表初始化數據成員,沒有定義初始化列表的構造函數在構造函數體中對數據成員賦值。
對於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成員變量以及基類的構造函數都需要初始化列表。

發佈了44 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章