建構函式初始化成員變數問題

2021-04-17 13:11:26 字數 1297 閱讀 1997

請問在建構函式中使用初始化清單和直接在建構函式內初始化成員變數有什麼區別?

比如:construct_function():var1(1),var2(2),var(3){}和

construct_function()

有沒有什麼本質區別?

construct_function():var1(1),var2(2),var(3)

{}初始化

construct_function()

賦值要是const型別的話只能使用初始化

是這個意思:

首先把資料成員按型別分類

1。內建資料型別,復合型別(指標,引用)

2。使用者定義型別(類型別)

分情況說明:

對於型別1,在成員初始化列表和建構函式體內進行,在效能和結果上都是一樣的

對於型別2,結果上相同,但是效能上存在很大的差別

因為類型別的資料成員物件在進入函式體是已經構造完成,也就是說在成員初始化列表處進行構造物件的工作,這是呼叫乙個建構函式,在進入函式體之後,進行的是對已經構造好的類物件的賦值,又呼叫個拷貝賦值操作符才能完成(如果並未提供,則使用編譯器提供的預設按成員賦值行為)

舉個例說明

class a;

class b

private:

a a;

}class a

a(int)

int value;

}像上面,我們使a物件的value為3,呼叫乙個a的建構函式+乙個預設拷貝賦值符,才達到目的

b::b():a(3){}

像這樣,只呼叫了乙個建構函式就達到了所需的物件啦,所以效能好的

對於const成員,無缺省建構函式的類物件成員,均需放在成員初始化列表

【suprwx】:

對於物件型別:

直接在建構函式裡初時化執行了兩步:

1 呼叫物件型別的無參建構函式完成初始化

2 呼叫物件型別的拷貝建構函式進行賦值

在初始化列表裡初始化只執行2

【todototry】:

class a

};class b

private:

const int ci;

a a;

};int main()

【todototry】:

上面給的這句話的例程

對於const成員,無缺省建構函式的類物件成員,均需放在成員初始化列表

!!!!!!!!!!總之用成員初始化表來初始化成員就是為了提高效率,但只有類擁有成員類物件時才有效果

所以如果你的類裡面沒有成員類物件,兩種初始化方式效率是一樣的

!!

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

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

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

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

C 類建構函式初始化列表及初始化成員變數的誤區

建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 cpp view plain copy class cexample 建構函式內部賦值 cexample 上面的例子中兩個建構函式的結果是一樣的。上面的建構函式 使用初始化列表的建構函...