c 建構函式用列表進行初始化的原因

2021-09-12 08:21:51 字數 1434 閱讀 9606

一、我的問題是關於初始化c++類成員的。我見過許多這樣的**:

csomeclass::csomeclass()

x=0;

y=1;

而在別的什麼地方則寫成下面的樣子:

csomeclass::csomeclass() : x(0), y(1)

我的一些程式設計師朋友說第二種方法比較好,但他們都不知道為什麼是這樣。你能告訴我這兩種類成員初始化方法的區別嗎?

回答從技術上說,你的程式設計師朋友是對的,但是在大多數情況下,兩者實際上沒有區別。有兩個原因使得我們選擇第二種語法,它被稱為成員初始化列表:乙個原因是必 須的,另乙個只是出於效率考慮。

讓我們先看一下第乙個原因——必要性。設想你有乙個類成員,它本身是乙個類或者結構,而且只有乙個帶乙個引數的建構函式。

class cmember

因為cmember有乙個顯式宣告的建構函式,編譯器不產生乙個預設建構函式(不帶引數),所以沒有乙個整數就無法建立cmember的乙個例項。

cmember* pm = new cmember; // error!!

cmember* pm = new cmember(2); // ok

如果cmember是另乙個類的成員,你怎樣初始化它呢?你必須使用成員初始化列表。

class cmyclass

在student類中有兩個資料成員,乙個是常量資料成員,乙個是引用資料成員,並且在建構函式中初始化了這兩個資料成員,但是這並不能通過編譯,因為常 量初始化時必須賦值,它的值是不能再改變的,與常量一樣引用初始化也需要賦值,定義了引用後,它就和引用的目標維繫在了一起,也是不能再被賦值的。所以c

++":"後初始化的機制,使引用和常量資料成員變為可能的,student類的建構函式應為:

student ::student(int i,int j):a(i),b(j){}

在下面的程式:

class teach

teach ::teach(charp,int a)

class student

;student::student(char *p)

在上面的程式中通不過編譯,編譯系統會告訴你teacher這個類物件缺預設建構函式,因為在teach 類中沒有定義預設的建構函式。那麼帶引數的建構函式怎麼進行構造呢?通過我們前面提到的冒號賦值。那它的建構函式應該是:

student::student(char *p,char *pl,int ag):teacher(pl,ag)

就是說在沒有預設建構函式的時候,如果乙個類物件是另乙個類的資料成員,那麼初始化這個數 據成員,就應該放到冒號後面。這樣可以帶引數。在類的定義中,如:

protected;

char name[30];

teach teacher

類物件是不能帶引數的,因為它只是宣告。

所以在c++中就增加了這種機制,這是物件導向程式設計所必須的。不知道我講明白沒有。如不明白請查閱有關資料。

C 建構函式 ,初始化列表

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

C 建構函式初始化列表

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

C 建構函式初始化列表

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