class中成員變數列表初始化和函式體賦值的區別

2021-07-02 19:19:35 字數 647 閱讀 3113

類中成員變數在建構函式中無論是列表初始化還是函式體賦值,其最終效果都是一樣的。但是在某些具體細節和效率方面是有所差別的。

class的成員變數可以分成兩類:(1)內建型別:int、char、bool等 (2)使用者自定義型別

class a 

a(int x,string str):

private:

int a;

string s;

};

1、若成員變數為內建型別

如果成員變數是內建型別的話,那麼列表初始化和函式體賦值的成本相同。但是為了一致性的考慮最好使用列表初始化。但是,有一種情況例外:如果成員變數是const或者references,必須使用列表初始化。

2、若成員變數是使用者自定義型別

兩個版本的所執行的動作如下

列表初始化:執行成員變數的copy建構函式。只執行一次成員變數的copy建構函式。

函式體賦值:首先呼叫成員函式的default建構函式,其次進入函式體,最後執行成員變數的copy assignment 操作符。如果我們採用函式體賦值,那麼在進入建構函式之前成員變數就已經利用各自的default建構函式進行了初始化操作,進入函式體之後,再次利用copy assignment 操作符賦值。這樣就執行了兩次成員變數的建構函式。

class中成員變數的初始化

在類class的定義中,不同定義方式的成員變數的初始化方式各不一樣。對於變數的初始化主要分以下幾種情況 1 普通變數 一般的成員變數的初始化不能在定義是進行初始化的,但此類資料成員是能夠在建構函式中進行初始化的,也能夠在初始化列表中進行初始化。使用建構函式定義方式如下 class test 使用初始...

初始化列表成員變數的初始化

對於以下程式 include using namespace std class base base b 0 a b int get a int get b int main 本想得到的結果是a,b都為90。但是實際結果卻是 4273046 90process returned 0 0x0 exec...

成員初始化列表

類物件的構造順序是這樣的 1.分配記憶體,呼叫建構函式時,隱式 顯示的初始化各資料成員 初始化階段可以是顯式的或隱式的,取決於是否存在成員初始化表。隱式初始化階段按照宣告的順序依次呼叫所有基類的預設建構函式,然後是所有成員類物件的預設建構函式。2.進入建構函式後在建構函式中執行一般計算 計算階段由建...