對於以下程式:
#include
using namespace std;
class base
base():b(0),a(b){}
int get_a()
int get_b()
};int main()
本想得到的結果是a,b都為90。但是實際結果卻是:
4273046
90process returned 0 (0x0) execution time : 0.101 s
press any key to continue.
也即此時輸出的第乙個數是乙個隨機數,第二個是90。
初始化列表的成員變數的初始化是根據成員變數的宣告順序初始化的!!!!。
變數a在變數b之前宣告,那麼在類base的建構函式初始化成員列表中,變數a會先定義,變數b會後定義,也就是說變數a會先初始化,而變數b會後初始化,所以,在執行base(int i): b(i),a(b)時,a的值用b來初始化,其結果將是乙個隨機值,而b的值是i=90.!!!!!!!!!!!!!!
改一下宣告的順序,或者初始化的順序都可以得到90 90。
例如:
#include
using namespace std;
class base
base():b(0),a(b){}
int get_a()
int get_b()
};int main()
結果:
90
90process returned 0 (0x0) execution time : 1.057 s
press any key to continue.
原因在於:在初始化列表中,成員變數的初始化順序是其在類中宣告順序,而非列表中的順序。!!!!!!
要注意按照與成員變數宣告一致的次序來編寫建構函式初始化列表,此外,盡可能避免使用成員來初始化其他成員,一般情況下,通過(重複)使用建構函式的形參而不是使用物件的資料成員,可以避免由初始化的執行次序而引起的任何問題。
成員初始化列表以及靜態私有變數初始化
在乙個類中,我們往往可能會定義乙個靜態變數,但在宣告乙個類的時候不會進行記憶體的申請,只有在進行物件定義的時候才會進行記憶體申請,但問題來了,在程式進行到建構函式的時候,要對靜態變數進行初始化,但因為是const靜態變數,不能改變其初始值,會出現錯誤。因此,必須在執行建構函式之前,在建立物件時進行初...
成員初始化列表
類物件的構造順序是這樣的 1.分配記憶體,呼叫建構函式時,隱式 顯示的初始化各資料成員 初始化階段可以是顯式的或隱式的,取決於是否存在成員初始化表。隱式初始化階段按照宣告的順序依次呼叫所有基類的預設建構函式,然後是所有成員類物件的預設建構函式。2.進入建構函式後在建構函式中執行一般計算 計算階段由建...
成員初始化列表
任乙個物件的建立都要呼叫建構函式,而在建構函式中一般要給物件屬性賦值。成員初始化列表 member initialize list 是建構函式中特有的語法,用以簡化對物件屬性的賦值。其用法如下 class myclass 以上 相當於 class myclass 用成員初始化列表的語法來表述很顯然 ...