C 初始化函式列表和建構函式內賦值的區別

2021-10-14 16:40:02 字數 1234 閱讀 3668

既然建構函式初始化列表和建構函式體內賦值都可以對成員變數賦值,那麼二者有何區別,是不是二者等效呢?

一、若類的資料成員是靜態的(const)和引用型別,必需用初始化列表

靜態(const)的資料成員只能初始化而不能賦值,同樣引用型別也是只可以被初始化,那麼只有用初始化列表。

如:

#include #include using namespace std;  

templateclass namedptr ;

templatenamedptr::namedptr(const string& initname, t *initptr )

: name(initname), ptr(initptr)

{}

//第二種方法是在建構函式體內賦值:

//template//namedptr::namedptr(const string& initname, t *initptr)

//

int main()

由於 const string name; //靜態資料成員的初始化必需用初始化列表

t * const ptr;

是靜態的,如果用建構函式體內賦值,編譯會出錯。

二、建構函式體內賦值會帶來額外的開銷,效率會低於建構函式初始化列表

上面的例子改一改:

c++** 

templateclass namedptr ;

並且用這兩中初始化方法做對比:

c++** 

//第一種方法:初始化列表  

templatenamedptr::namedptr(const string& initname, t *initptr )

: name(initname), ptr(initptr)

{}

//第二種方法是在建構函式體內賦值:

templatenamedptr::namedptr(const string& initname, t *initptr)

當用第二種方法初始化資料成員時會兩次對string的成員函式的呼叫:一次是預設建構函式,另一次是賦值。

而用第一種方法(初始化列表)只是一次呼叫預設的建構函式,並不會呼叫賦值函式。會減少不必要的開支,當類相當複雜時,就會看出使用初始化列表的好處。

原文:

建構函式初始化列表和初始化函式

其實並沒有所謂的初始化函式的概念,本文中的初始化函式只是說明在函式體內進行賦值。而初始化列表才是真正意義上的物件初始化。使用初始化列表效率會高一點。c 規定,物件的成員變數的初始化動作發生在進入建構函式本體之前。在建構函式體內只是賦值,並不是初始化。請看下面這個栗子 class base publi...

關於初始化建構函式列表

建構函式初始化列表 建構函式初始化列表示例如下 sales item sales item const string book isbn book units sold 0 revenue 0 建構函式初始化列表以冒號開始,以逗號分隔資料成員,每個資料成員後面跟上其初始值,上面的建構函式將isbn成...

C 初始化函式列表

在以下三種情況下需要使用初始化成員列表 一,需要初始化的資料成員是物件的情況 二,需要初始化const修飾的類成員 三,需要初始化引用成員資料 原因 c 可以定義引用型別的成員變數,引用型別的成員變數必須在建構函式的初始化列表中進行初始化。對於類成員是const修飾,或是引用型別的情況,是不允許賦值...