c++ 構(gòu)造函數(shù)的初始化列表
首先,運行下圖中的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是一個隨機的數(shù)字,n2為0。在C++中,成員變量的初始化順序與變量在類型中的聲明順序相同,而與它們在構(gòu)造函數(shù)的初始化列表中的順序無關(guān)。因此在這道題中,會首先初始化n1,而初始n1的參數(shù)n2還沒有初始化,是一個隨機值,因此n1就是一個隨機值。初始化n2時,根據(jù)參數(shù)0對其初始化,故n2=0。
構(gòu)造函數(shù)的初始化列表僅僅指定用于初始化成員的值,并不指定這些初始化執(zhí)行的次序。成員初始化的次序就是定義成員的次序,第一個成員首先被初始化,然后是第二個,依次類推。也就是說,C++編譯器很容易得到構(gòu)造函數(shù)的參數(shù)列表,獲取參數(shù),然后根據(jù)成員變量的聲明順序初始化成員變量(這是因為,后聲明的變量有可能依賴先聲明的成員變量,因此要有先聲明先初始化,后聲明的后初始化)。
大家可能看到這里就會覺得,好麻煩啊,當類中的一個數(shù)據(jù)成員是根據(jù)其他數(shù)據(jù)成員而初始化的時候,初始化列表的次序不能跟成員變量的聲明次序不一致,否則會出現(xiàn)不可預(yù)料的錯誤。
的確是這樣的,所以有人就會想到,我干脆把初始化列表的那些操作都放到構(gòu)造函數(shù)的函數(shù)體內(nèi)對數(shù)據(jù)成員進行賦值操作就行了,的確這樣做是可以的,但是有時構(gòu)造函數(shù)的初始化列表是必須的。
有些數(shù)據(jù)成員必須在構(gòu)造函數(shù)初始化列表中進行初始化。對于這樣的成員,在構(gòu)造函數(shù)體內(nèi)對它們賦值是不起作用的。沒有默認構(gòu)造函數(shù)的類類型的成員,以及const類型的成員變量和引用類型的成員變量,不管是哪種類型,都必須在構(gòu)造函數(shù)初始化列表中進行初始化。
例如,下面的構(gòu)造函數(shù)定義就是錯誤的:
class A
{
private:
int i;
const int j;
int &k;
public:
A(int ii)
{
i = ii;
j = ii;
k = ii;
}
};
記住,可以初始化 const 對象或引用類型的對象,但不能對它們賦值。在開始執(zhí)行構(gòu)造函數(shù)的函數(shù)體之前,要完成初始化,初始化 const 或引用類型的數(shù)據(jù)成員的唯一機會就是在構(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)文章
C語言輸入一個數(shù)判斷是否為素數(shù)的多種方法
素數(shù)是只能被1和它自己本身整除,不能被其他自然數(shù)整除的大于1的正整數(shù),下面這篇文章主要給大家介紹了關(guān)于C語言輸入一個數(shù)判斷是否為素數(shù)的多種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-04-04
解析C++編程中如何使用設(shè)計模式中的狀態(tài)模式結(jié)構(gòu)
這篇文章主要介紹了如何在C++編程中適用設(shè)計模式中的狀態(tài)模式結(jié)構(gòu),狀態(tài)模式強調(diào)將特定狀態(tài)相關(guān)的邏輯分散到一些類的狀態(tài)類中,需要的朋友可以參考下2016-03-03
好用的C++ string Format“函數(shù)”介紹
大家好,本篇文章主要講的是好用的C++ string Format“函數(shù)”介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
C語言獲取Shell返回結(jié)果的實現(xiàn)方法
下面小編就為大家?guī)硪黄狢語言獲取Shell返回結(jié)果的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-07-07
stringstream操縱string的方法總結(jié)
下面小編就為大家?guī)硪黄猻tringstream操縱string的方法總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
C++與namespace有關(guān)的兩個編譯錯誤的講解
今天小編就為大家分享一篇關(guān)于C++與namespace有關(guān)的兩個編譯錯誤的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04

