請(qǐng)看下面的代碼:
template<class t>
class array {
public:
array(int lowbound, int highbound);
...
private:
vector<t> data; // 數(shù)組數(shù)據(jù)存儲(chǔ)在vector對(duì)象中
// 關(guān)于vector模板參見(jiàn)條款49
size_t size; // 數(shù)組中元素的數(shù)量
int lbound, hbound; // 下限,上限
};
template<class t>
array<t>::array(int lowbound, int highbound)
: size(highbound - lowbound + 1),
lbound(lowbound), hbound(highbound),
data(size)
{
}
里面有個(gè)嚴(yán)重的錯(cuò)誤,絕對(duì)沒(méi)人會(huì)知道data里會(huì)有多少個(gè)元素。你也許認(rèn)為在data之前size已經(jīng)被初始化了,實(shí)則不然,類成員變量的初始化不是按照初始化表的順序被初始化的,而是按照在類中聲明的順序被初始化的。
為什么會(huì)這樣呢?我們知道,對(duì)一個(gè)對(duì)象的所有成員來(lái)說(shuō),它們的析構(gòu)函數(shù)被調(diào)用的順序總是和它們?cè)跇?gòu)造函數(shù)里被創(chuàng)建的順序相反。那么,如果允許上面的情況(即,成員按它們?cè)诔跏蓟斜砩铣霈F(xiàn)的順序被初始化)發(fā)生,編譯器就要為每一個(gè)對(duì)象跟蹤其成員初始化的順序,以保證它們的析構(gòu)函數(shù)以正確的順序被調(diào)用。這會(huì)帶來(lái)昂貴的開(kāi)銷。所以,為了避免這一開(kāi)銷,同一種類型的所有對(duì)象在創(chuàng)建(構(gòu)造)和摧毀(析構(gòu))過(guò)程中對(duì)成員的處理順序都是相同的,而不管成員在初始化列表中的順序如何。
注意:上述內(nèi)容不適用于static變量,static變量應(yīng)該在類的構(gòu)造函數(shù)前被初始化。