請看下面的代碼:
template<class t>
class array {
public:
array(int lowbound, int highbound);
...
private:
vector<t> data; // 數組數據存儲在vector對象中
// 關于vector模板參見條款49
size_t size; // 數組中元素的數量
int lbound, hbound; // 下限,上限
};
template<class t>
array<t>::array(int lowbound, int highbound)
: size(highbound - lowbound + 1),
lbound(lowbound), hbound(highbound),
data(size)
{
}
里面有個嚴重的錯誤,絕對沒人會知道data里會有多少個元素。你也許認為在data之前size已經被初始化了,實則不然,類成員變量的初始化不是按照初始化表的順序被初始化的,而是按照在類中聲明的順序被初始化的。
為什么會這樣呢?我們知道,對一個對象的所有成員來說,它們的析構函數被調用的順序總是和它們在構造函數里被創建的順序相反。那么,如果允許上面的情況(即,成員按它們在初始化列表上出現的順序被初始化)發生,編譯器就要為每一個對象跟蹤其成員初始化的順序,以保證它們的析構函數以正確的順序被調用。這會帶來昂貴的開銷。所以,為了避免這一開銷,同一種類型的所有對象在創建(構造)和摧毀(析構)過程中對成員的處理順序都是相同的,而不管成員在初始化列表中的順序如何。
注意:上述內容不適用于static變量,static變量應該在類的構造函數前被初始化。