C++初始化列表實(shí)現(xiàn)方法詳解
C++編程語(yǔ)言應(yīng)用范圍非常廣泛,而且應(yīng)用方式靈活,在一定程度上提高了編程人員的開(kāi)發(fā)效率。那么接下來(lái),我們就可以通過(guò)以下對(duì)C++初始化列表的相關(guān)實(shí)現(xiàn)方法的掌握,來(lái)初步了解這一語(yǔ)言的應(yīng)用技巧。
先看下面這段程序
- #include < iostream>
- #include < vector>
- using namespace std;
- class array
- {
- public:
- array(int lowbound, int highbound);
- vector< int> data;
- int size;
- int lbound, hbound;
- };
- array::array(int lowbound, int highbound):
- size(highbound-lowbound+1),
- lbound(lowbound),hbound(highbound),
- data(size){}
- int main()
- {
- array a(0,10);
- cout < < a.size < < '\n';
- cout < < a.data.size() < < '\n';
- }
這段程序看不出什么問(wèn)題,至少一開(kāi)始我看不出什么問(wèn)題,但是運(yùn)行的結(jié)果讓我吃驚,vector< int> data的長(zhǎng)度是一個(gè)不確定的大小。
許多人都會(huì)說(shuō),在函數(shù)的C++初始化列表中進(jìn)行了初始化了么?怎么還會(huì)沒(méi)有長(zhǎng)度大小呢!其實(shí)是我們忽略了構(gòu)造函數(shù)懂初始化列表的游戲規(guī)則,構(gòu)造函數(shù)初始化的順序并不是按照我們看到的在構(gòu)造函數(shù)后面寫(xiě)的順序,而是按照成員變量在類中的定義的順序,所以上面
- array::array(int lowbound, int highbound):
- size(highbound-lowbound+1),
- lbound(lowbound),hbound(highbound),
- data(size){}
的運(yùn)行順序是按照下面的代碼的實(shí)現(xiàn)順序:
- array::array(int lowbound, int highbound):
- data(size),size(highbound-lowbound+1),
- lbound(lowbound),hbound(highbound) {}
所以當(dāng)運(yùn)行data(size)的時(shí)候,size還沒(méi)有定義,所以在后面的測(cè)試程序中輸出的data.size()的時(shí)候,就輸出了一個(gè)不確定的數(shù)。
那么C++為什么要這么做呢?
我們知道,對(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ì)成員的處理順序都是相同的,而不管成員在C++初始化列表中的順序如何。
【編輯推薦】