C 建構函式的初始化列表

2021-07-30 04:15:49 字數 894 閱讀 4400

在c++中,乙個簡單的建構函式可以如下所示:

class x

};

c++也提供了另外一種初始化成員變數的寫法,即初始化列表:

class x

};

第二種寫法,就是建構函式初始化列表。那麼問題來了,為什麼要使用這個方法來寫建構函式呢?有什麼好處嗎?那就要從c++的變數初始化說起。

首先,c++變數初始化有2種方法,直接初始化和複製初始化。複製初始化就是使用=號的初始化,而直接初始化就是使用()符號進行的初始化。

比如:

int age(20);  //直接初始化

int age = 20; //複製初始化

複製初始化使用 = 號,很容易讓人以為是進行了賦值操作而不是初始化操作,但是兩者並不是一回事,初始化是給變數分配記憶體並且給它賦值,而賦值就是替換當前變數的值。

也就是說:

int age = 20; //初始化

age = 30; //賦值

第一行**是初始化,第二行**是賦值,雖然它們都是用了 = 號。

直接初始化比複製初始化更快,更靈活,大部分時間,看不出它們之間的區別,但在編寫類的時候,就可能會看出來它們的區別。直接初始化時,編譯器會呼叫建構函式直接賦值,而複製初始化時,編譯器會先呼叫直接建構函式建立乙個臨時的物件,然後再呼叫複製建構函式進行賦值,所以直接初始化會更快。有時候,有些不支援複製的型別,就不能用複製初始化了。

因此,使用初始化列表,可以使初始化效率更高。

還有乙個更重要的原因,是因為使用初始化列表,可以避免編譯時期的錯誤,因為有些成員變數,必須在初始化時賦值的。比如const 變數,還有一些沒有預設建構函式的類,在初始化時,需要顯式的傳入引數進行初始化。

C 建構函式 ,初始化列表

c 中的類的建構函式 1.如果類中沒有定義建構函式,編譯器將生成乙個預設建構函式,這個預設建構函式會呼叫類中所有成員的預設建構函式,但不會對如int,double的基本資料型別做初始化 2.類中可以定義多個建構函式,但每個建構函式應該有不同的引數實現 3.預設建構函式必須定義的情況,當需要定義乙個物...

C 建構函式初始化列表

從概念上講,可以認為建構函式分兩個階段進行 1.初始化階段 2.普通的計算階段。計算階段由建構函式函式體中的所有語句組成 不管成員是否在建構函式初始化列表中顯示初始化,類型別的資料成員總是在初始化階段初始化。初始化發生在計算階段的開始之前。建議 使用建構函式初始化列表 注 必須對任何const或引用...

C 建構函式初始化列表

建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 example example ival 0 dval 0.0 ival 和dval是類的兩個資料成員 上面的例子和下面不用初始化列表的建構函式看似沒什麼區別 example exam...