C++ 學習之構造函數:構造函數小結2 構造函數初始化列表

構造函數初始化列表以一個冒號:開始,接着是一個以逗號分隔的數據成員列表,每個數據成員後面跟着一個圓括號的初始化式。

在日常使用中,構造函數初始化列表可以使用,也可以省略。此時要弄清楚構造函數執行其實是分爲兩個階段的:1)初始化階段;2)普通的計算階段階段。

初始化階段:初始化列表中顯示初始化的成員按照列表中圓括號內的值初始化,而對於初始化列表中沒有顯式列出的成員,若是類成員,則調用該類型的默認構造函數初始化,若是內置類型或者複合類型,則按照變量初始化的原則,在局部作用域中的不做初始化,全局作用於中的初始化爲0。

普通的計算階段:一般是指在構造函數的函數體內對數據成員做賦值工作,千萬記住,在函數體內進行賦值操作之前,數據成員的初始化已經完成。

但是有3中情況一定要用到構造函數初始化列表的:類中的數據成員含有1)沒有默認構造函數的類類型成員2)const數據成員3)引用成員。

舉個例子:

此時,我們編譯程序可以看到會報錯:

 

因爲該構造函數沒有對const和引用數據成員使用構造函數初始化列表進行初始化,後面構造函數體內的賦值就會變成不合法的。

正確的構造函數應該爲程序中綠色部分的使用初始化列表的構造函數。

之後我們再次運行程序可以得到想要的結果:

在使用初始化列表時,要注意一個小問題,就是數據成員的初始化問題,我們寫初始化列表時一個別較好的習慣是初始化列表中成員初始化的順序最好按照數據成員在類中定義的順序。避免一些小麻煩。

如class X{

     public:

     X(int val):j(val),i(j){}

     private:

               int i;

               int j;

};

編譯此程序會出錯,原因在於初始化列表初始化數據成員是按照定義的順序進行的,首先要初始化成員i,而成員i是用j來初始化的,此時j還沒有初始化,因此會出錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章