首先,運行下圖中的C++代碼,輸出是什么?
構造函數的初始化列表僅僅指定用于初始化成員的值,并不指定這些初始化執行的次序。成員初始化的次序就是定義成員的次序,第一個成員首先被初始化,然后是第二個,依次類推。也就是說,C++編譯器很容易得到構造函數的參數列表,獲取參數,然后根據成員變量的聲明順序初始化成員變量(這是因為,后聲明的變量有可能依賴先聲明的成員變量,因此要有先聲明先初始化,后聲明的后初始化)。
大家可能看到這里就會覺得,好麻煩啊,當類中的一個數據成員是根據其他數據成員而初始化的時候,初始化列表的次序不能跟成員變量的聲明次序不一致,否則會出現不可預料的錯誤。
的確是這樣的,所以有人就會想到,我干脆把初始化列表的那些操作都放到構造函數的函數體內對數據成員進行賦值操作就行了,的確這樣做是可以的,但是有時構造函數的初始化列表是必須的。
有些數據成員必須在構造函數初始化列表中進行初始化。對于這樣的成員,在構造函數體內對它們賦值是不起作用的。沒有默認構造函數的類類型的成員,以及const類型的成員變量和引用類型的成員變量,不管是哪種類型,都必須在構造函數初始化列表中進行初始化。
例如,下面的構造函數定義就是錯誤的:
A() : j(0) , k(i)
{ }
};
int main(void)
{
A a;
return 0;
}
新聞熱點
疑難解答
圖片精選