c++ 結構函數的初始化列表。本站提示廣大學習愛好者:(c++ 結構函數的初始化列表)文章只能為提供參考,不一定能成為您想要的結果。以下是c++ 結構函數的初始化列表正文
起首,運轉下圖中的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是一個隨機的數字,n2為0。在C++中,成員變量的初始化次序與變量在類型中的聲明次序雷同,而與它們在結構函數的初始化列表中的次序有關。是以在這道題中,會起首初始化n1,而初始n1的參數n2還沒有初始化,是一個隨機值,是以n1就是一個隨機值。初始化n2時,依據參數0對其初始化,故n2=0。
結構函數的初始化列表僅僅指定用於初始化成員的值,其實不指定這些初始化履行的順序。成員初始化的順序就是界說成員的順序,第一個成員起首被初始化,然後是第二個,順次類推。也就是說,C++編譯器很輕易獲得結構函數的參數列表,獲得參數,然後依據成員變量的聲明次序初始化成員變量(這是由於,後聲明的變量有能夠依附先聲明的成員變量,是以要有先聲明先初始化,後聲明的後初始化)。
年夜家能夠看到這裡就會認為,好費事啊,當類中的一個數據成員是依據其他數據成員而初始化的時刻,初始化列表的順序不克不及跟成員變量的聲明順序紛歧致,不然會湧現弗成預感的毛病。
切實其實是如許的,所以有人就會想到,我爽性把初始化列表的那些操作都放到結構函數的函數體內對數據成員停止賦值操作就好了,切實其實如許做是可以的,但是有時結構函數的初始化列表是必需的。
有些數據成員必需在結構函數初始化列表中停止初始化。關於如許的成員,在結構函數體內對它們賦值是不起感化的。沒有默許結構函數的類類型的成員,和const類型的成員變量和援用類型的成員變量,不論是哪一種類型,都必需在結構函數初始化列表中停止初始化。
例如,上面的結構函數界說就是毛病的:
class A
{
private:
int i;
const int j;
int &k;
public:
A(int ii)
{
i = ii;
j = ii;
k = ii;
}
};
記住,可以初始化 const 對象或援用類型的對象,但不克不及對它們賦值。在開端履行結構函數的函數體之前,要完成初始化,初始化 const 或援用類型的數據成員的獨一機遇就是在結構函數的初始化列表中。
例如,上面的結構函數界說就是准確的:
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;
}