C 中什麼情況下必須在初始化列表中完成初始化

2021-08-16 19:02:44 字數 1642 閱讀 6805

1、當類的成員是常變數時,即用const來回修飾的類的成員;

2、類的成員是引用;

3、需要初始化的資料成員是

物件的情況(這裡包含了繼承情況下,通過顯示呼叫父類的建構函式對父類資料成員進行初始化); 

資料成員是物件,並且這個物件只有含引數的建構函式,沒有無引數的建構函式;

如果我們有乙個類成員,它本身是乙個類或者是乙個結構,而且這個成員它只有乙個帶引數的建構函式,而沒有預設建構函式,這時要對這個類成員進行初始化,就必須呼叫這個類成員的帶引數的建構函式,如果沒有初始化列表,那麼他將無法完成第一步,就會報錯。

4.、如果類存在繼承關係,派生類必須在其初始化列表中呼叫基類的建構函式。即子類初始化父類的私有成員。

基於前兩種情況的原因:

類物件的構造順序是這樣的:

1.分配記憶體,呼叫建構函式時,隱式/顯示的初始化各資料成員;

2.進入建構函式後在建構函式中執行一般賦值與計算。而對於const成員或者引用,必須在呼叫建構函式進入函式體之前就的得完成初始化。如果直接在定義時就賦值,那麼類的所有物件的這個成員的值就是一樣了,就失去了變數的意義。

#include#includeusing namespace std;

class a

void print_val()

private:

const int i;//這裡也可以直接完成初始化,const int i=100,不報錯,但是去變數意義

int p;

int &j=p;

};

int main(int argc, char **argv)
3、對第三的解釋

#include using namespace std;  

class test1

// 無參建構函式

test1(const test1& t1) // 拷貝建構函式

test1& operator = (const test1& t1) // 過載賦值運算子(也稱為過載賦值函式)

private:

int a ;

};

class test2

};  

輸出為:

construct test1

end of fist construct t1

copy constructor for test1

第一行輸出對應 呼叫**的第一行

第三行輸出對應test2的初始化列表,直接呼叫拷貝建構函式初始化test1,省去了呼叫預設建構函式的過程。

所以乙個好的原則是,能使用初始化列表的時候盡量使用初始化列表。

4、對第四的解釋

#include using namespace std;

class base

private:

int val;

}; class a : public base

void print_val()

private:

int p;

}; int main(int argc ,char **argv)

什麼情況下會初始化類

都什麼情況下會初始化類 public class a static public void run public void service public class b extends a public static void main string args 答案 static block a s...

c 必須在類初始化列表中初始化的幾種情況

1.類成員為const型別 2.類成員為引用型別 include using namespace std class a void print val private const inti const intp int j 引用 int main int argc char argv 究其因 con...

c 必須在類初始化列表中初始化的幾種情況

1.類成員為const型別 2.類成員為引用型別 include using namespace std class a void print val private const int i int p int j int main int argc char argv 究其因 const物件或引用...