C 建構函式初始化成員列表

2021-08-01 12:56:30 字數 1174 閱讀 4075

1.只能在建構函式初始化列表初始化的成員變數的型別?

a.const成員變數

b.引用型別的成員變數

c.static不能在初始化列表中進行初始化

d.類成員變數中有自定義型別的變數最好在初始化列表中進行初始化

2.初始化列表的順序?

初始化列表的初始化順序是依據類成員變數定義的順序來決定的。

3.關於static const是否應該在初始化成員列表中初始化?

static const為全域性靜態常量,全域性的意思是該變數屬於整個類而非某個類例項,所以不能再初始化列表中進行初始化。

1  好多書籍都建議我們直接使用初始化列表為成員進行初始化,為什麼呢?

我想原因有二:

①考慮到效率

②有些成員不得不這麼做(const,引用)

為什麼使用初始化列表就效率呢?

其實也不一定,

對於內建型別,在函式體內賦值和在初始化列表中初始化兩者的效率是等同的。但是為了美觀和一致性的問題,《effective c++》作者建議我們還是用初始化列表進行。但是這也不是在所有情況下都是必須的。若乙個類的建構函式很多的時候,這時每個建構函式都有自己的初始列,這樣多份成員的初始列就會導致煩人的重複。這時我們可以選擇那些「賦值表現得像初始化一樣好」的成員變數,改用它們為賦值。然後把他們放到乙個函式中,供所有的構造函式呼叫。

對於類型別,兩者的效率就相差很多了:

初始化列表的執行發生在進入函式體之前,它是在呼叫建構函式是進行初始化的。而對於函式體內的賦值(非初始化,而是賦值),它是首相呼叫了類的預設建構函式來初始化成員變數,而後在函式體中呼叫賦值函式為成員變數賦值的。顯然這個和初始化列表相比預設建構函式的呼叫就浪費了。效率低了很多。

有些成員變數必須用初始化列表

const 和引用 型別的成員變數必須得用初始化列表進行初始化。其實這沒什麼高明的,也並不是乙個明文規定。而是為遵守我們另乙個規則而必須這麼做。這個規則就是」const和引用型別的變數必須初始化「。而我們通過上面也明白了,函式體內是賦值而非初始化,若我們將const和引用型別的成員變數放在建構函式的函式體內的話。那麼const和引用型別的變數將會沒有初值,即沒被初始化,根據我們另乙個規則,當然會發生錯誤,編譯器不允許我們這麼做的。故:我們在建構函式中必須選擇初始化列表對const和引用型別的成員變數進行初始化。

C 中建構函式初始化成員列表總結

1.只能在建構函式初始化列表初始化的成員變數的型別?a.const成員變數 b.引用型別的成員變數 c.static不能在初始化列表中進行初始化 d.類成員變數中有自定義型別的變數最好在初始化列表中進行初始化 2.初始化列表的順序?初始化列表的初始化順序是依據類成員變數定義的順序來決定的。3.關於s...

C 初始化成員列表

c 在類的建構函式中,可以兩種方式初始化成員資料 data member 1,在建構函式的實現中,初始類的成員資料。諸如 class point int getx int gety 2,還可以定義初始化成員列表 initializer list 來初始化成員資料 data member 改寫建構函式...

建構函式初始化列表初始化成員變數的順序

include include include using namespace std class point point point point p intgetx intgety intmain 執行結果如下 可以看到m x m y按照我們預想的結果進行了初始化,輸出結果符合預期。接下來我們將私...