国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

c++ 構造函數的初始化列表

2020-01-26 15:59:20
字體:
來源:轉載
供稿:網友

首先,運行下圖中的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;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 象州县| 临桂县| 湖南省| 韩城市| 原阳县| 陈巴尔虎旗| 泸定县| 山阴县| 秀山| 大兴区| 垣曲县| 凉城县| 东宁县| 呼图壁县| 怀安县| 天长市| 东阿县| 香河县| 封丘县| 浮山县| 香格里拉县| 康马县| 含山县| 武定县| 大同市| 东宁县| 象山县| 云和县| 揭西县| 社会| 会宁县| 沙河市| 四会市| 苍山县| 乐安县| 水城县| 水富县| 河北区| 孟连| 水富县| 通江县|