C 建構函式初始化列表

2021-06-09 16:06:22 字數 2281 閱讀 6328

建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如:

example::example() : ival(0), dval(0.0) {} //ival 和dval是類的兩個資料成員

上面的例子和下面不用初始化列表的建構函式看似沒什麼區別:

example::example()

的確,這兩個建構函式的結果是一樣的。但區別在於:上面的建構函式(使用初始化列表的建構函式)顯示的初始化類的成員;而沒使用初始化列表的建構函式是對類的成員賦值並沒有進行顯示的初始化

初始化和賦值對內建型別的成員沒有什麼大的區別,像上面的任乙個建構函式都可以。但有的時候必須用帶有初始化列表的建構函式

(1)成員型別是沒有預設建構函式的類。若沒有提供顯示初始化式,則編譯器隱式使用成員型別的預設建構函式,若類沒有預設建構函式,則編譯器嘗試使用預設建構函式將會失敗。

(2)const

成員或引用型別的成員。因為const物件或引用型別只能初始化,不能對他們賦值。

c++在類的建構函式中,可以兩種方式初始化成員資料(data member)。

1,在建構函式的實現中,初始類的成員資料。諸如:

class point

int getx()

int gety()

};2,還可以定義初始化成員列表(initializer list)來初始化成員資料(data member)。

改寫建構函式如下:

point(int m=0,int n=0):x(m),y(n)

這樣咋一看沒有什麼不同,確實,對於上面的這種簡單列子來說,也真的沒有太大不同。

那我們為什麼要用初始化成員列表,什麼時候用初始化成員列表來初始化成員資料呢?lippman的《c++ primer》中提到在以下三種情況下需要使用初始化成員列表:

一,需要初始化的資料成員是物件的情況;

二,需要初始化const修飾的類成員;

三,需要初始化引用成員資料;

現在分別舉例說明:

一,需要初始化的資料成員是物件。

---------------------------

#include

class point

point(point& p)

int getx()

int gety()

};class point3d

point3d(int i,int j, int k):m_p(i,j)   // 相當於 point m_p(i,j)這樣對m_p初始化

void print()

};---------------------------------------

上述**中point3d是乙個3d座標,他有乙個point的2d座標和乙個成員組成。

我們現在想定義乙個3d座標p3d,可以這樣實現:

void main()

從point3d實現體可以看出,我們是通過對m_p進行賦值,這樣不僅呼叫copy constructor產生

臨時物件

而且是對m_p的乙個賦值操作。

而如果使用成員初始化列表,我們則可以這樣:

void main()

p3d中的point型成員是通過呼叫初始化的方式構建的。由於物件賦值比初始化要麻煩的多,因此也帶來的效能上的消耗。(可以參見scott meyers著《effective c++》條款12)。

這也是我們在對成員資料是物件成員的採用初始化列表進行初始始化的主要原因。

二,需要初始化const修飾的類成員;

三,需要初始化引用成員資料;

對於類成員是const修飾,或是引用型別的情況,是不允許賦值操作的,(顯然嘛,const就是防止被錯誤賦值的,引用型別必須定義賦值在一起)因此只能用初始化列表對齊進行初始化。

上面兩點比較好明白,可以用乙個例子加以說明:

-------------------------------------

#include

class base

base(int m, int n):a(m),b(n)

{}};

void main()

---------------------------

上面紅色的部分初始化的方式是不允許的通不過編譯,通過初始化列表則可以很好的定義。

C 建構函式 ,初始化列表

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

C 建構函式初始化列表

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

C 建構函式初始化列表

建構函式初始化列表是乙個重要的概念,這一步是建構函式執行時無論如何也要走的一步。建構函式可以說成三部分構成,1 引數列表 2 初始化列表 3 函式體。其中初始化列表是可選的。在一定情況下不需要初始化列表。以下是c primer上面的一段 sales item sales item const str...