c++ 構(gòu)造函數(shù)的初始化列表
首先,運(yùn)行下圖中的C++代碼,輸出是什么?
class A
{
private:
int n1;
int n2;
public:
A(): n2(0) , n1(n2 + 2)
{
}
void Print()
{
cout<<"n1:"<<n1<<",n2:"<<n2<<endl;
}
};
int main(void)
{
A a;
a.Print();
return 0;
}
答案:
輸出n1是一個(gè)隨機(jī)的數(shù)字,n2為0。在C++中,成員變量的初始化順序與變量在類型中的聲明順序相同,而與它們?cè)跇?gòu)造函數(shù)的初始化列表中的順序無(wú)關(guān)。因此在這道題中,會(huì)首先初始化n1,而初始n1的參數(shù)n2還沒(méi)有初始化,是一個(gè)隨機(jī)值,因此n1就是一個(gè)隨機(jī)值。初始化n2時(shí),根據(jù)參數(shù)0對(duì)其初始化,故n2=0。
構(gòu)造函數(shù)的初始化列表僅僅指定用于初始化成員的值,并不指定這些初始化執(zhí)行的次序。成員初始化的次序就是定義成員的次序,第一個(gè)成員首先被初始化,然后是第二個(gè),依次類推。也就是說(shuō),C++編譯器很容易得到構(gòu)造函數(shù)的參數(shù)列表,獲取參數(shù),然后根據(jù)成員變量的聲明順序初始化成員變量(這是因?yàn)?,后聲明的變量有可能依賴先聲明的成員變量,因此要有先聲明先初始化,后聲明的后初始化)。
大家可能看到這里就會(huì)覺(jué)得,好麻煩啊,當(dāng)類中的一個(gè)數(shù)據(jù)成員是根據(jù)其他數(shù)據(jù)成員而初始化的時(shí)候,初始化列表的次序不能跟成員變量的聲明次序不一致,否則會(huì)出現(xiàn)不可預(yù)料的錯(cuò)誤。
的確是這樣的,所以有人就會(huì)想到,我干脆把初始化列表的那些操作都放到構(gòu)造函數(shù)的函數(shù)體內(nèi)對(duì)數(shù)據(jù)成員進(jìn)行賦值操作就行了,的確這樣做是可以的,但是有時(shí)構(gòu)造函數(shù)的初始化列表是必須的。
有些數(shù)據(jù)成員必須在構(gòu)造函數(shù)初始化列表中進(jìn)行初始化。對(duì)于這樣的成員,在構(gòu)造函數(shù)體內(nèi)對(duì)它們賦值是不起作用的。沒(méi)有默認(rèn)構(gòu)造函數(shù)的類類型的成員,以及const類型的成員變量和引用類型的成員變量,不管是哪種類型,都必須在構(gòu)造函數(shù)初始化列表中進(jìn)行初始化。
例如,下面的構(gòu)造函數(shù)定義就是錯(cuò)誤的:
class A
{
private:
int i;
const int j;
int &k;
public:
A(int ii)
{
i = ii;
j = ii;
k = ii;
}
};
記住,可以初始化 const 對(duì)象或引用類型的對(duì)象,但不能對(duì)它們賦值。在開始執(zhí)行構(gòu)造函數(shù)的函數(shù)體之前,要完成初始化,初始化 const 或引用類型的數(shù)據(jù)成員的唯一機(jī)會(huì)就是在構(gòu)造函數(shù)的初始化列表中。
例如,下面的構(gòu)造函數(shù)定義就是正確的:
class A
{
private:
int i;
const int j;
int &k;
public:
A(int ii) : i(ii) , j(i) , k(ii)
{
}
A() : j(0) , k(i)
{ }
};
int main(void)
{
A a;
return 0;
}
相關(guān)文章
Linux網(wǎng)絡(luò)編程之socket文件傳輸示例
這篇文章主要介紹了Linux網(wǎng)絡(luò)編程之socket文件傳輸示例,對(duì)于基于Linux平臺(tái)的C程序員來(lái)說(shuō)有一定的借鑒價(jià)值,需要的朋友可以參考下2014-08-08VSCode與Keil聯(lián)合開發(fā)STM32的流程
這篇文章主要介紹了VSCode與Keil聯(lián)合開發(fā)STM32的流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02C++實(shí)現(xiàn)動(dòng)態(tài)煙花代碼
這篇文章主要介紹了利用C++實(shí)現(xiàn)的放煙花程序,用到了EGE圖形庫(kù),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下2023-01-01C語(yǔ)言棧順序結(jié)構(gòu)實(shí)現(xiàn)代碼
一個(gè)能夠自動(dòng)擴(kuò)容的順序結(jié)構(gòu)的棧 ArrStack 實(shí)例 (GCC編譯),有需要的朋友可以參考一下2013-10-10C++ virtual destructor虛擬析構(gòu)函數(shù)
C++中基類采用virtual虛析構(gòu)函數(shù)是為了防止內(nèi)存泄漏。具體地說(shuō),如果派生類中申請(qǐng)了內(nèi)存空間,并在其析構(gòu)函數(shù)中對(duì)這些內(nèi)存空間進(jìn)行釋放,今天通過(guò)本文給大家介紹C++ virtual destructor虛擬析構(gòu)函數(shù)的相關(guān)知識(shí),感興趣的朋友一起看看吧2021-05-05C++分析構(gòu)造函數(shù)與析造函數(shù)的特點(diǎn)梳理
本文對(duì)類的構(gòu)造函數(shù)和析構(gòu)函數(shù)進(jìn)行總結(jié),主要包括了構(gòu)造函數(shù)的初始化、重載、使用參數(shù)和默認(rèn)參數(shù),拷貝構(gòu)造函數(shù)和析構(gòu)函數(shù),希望能幫助讀者在程序開發(fā)中更好的理解類,屬于C/C++基礎(chǔ)2022-05-05C語(yǔ)言中二維數(shù)組指針的簡(jiǎn)要說(shuō)明
這篇文章主要介紹了C語(yǔ)言中二維數(shù)組指針的簡(jiǎn)要說(shuō)明,文章后也附送一個(gè)小練習(xí)題進(jìn)行鞏固,需要的朋友可以參考下2015-08-08C語(yǔ)言實(shí)現(xiàn)字母大小寫轉(zhuǎn)換的方法
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)字母大小寫轉(zhuǎn)換的方法,涉及C語(yǔ)言字符串的遍歷與轉(zhuǎn)換技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-07-07