C 類建構函式初始化變數

2021-06-16 17:59:11 字數 1915 閱讀 3275

2009-12-18 17:46:48

|  分類:

c++|

字型大小訂閱

與任何其他函式一樣,建構函式具有名字、形參表和函式體。

與其他函式不同的是,建構函式也可以包含乙個建構函式初始化列表:

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

//recommedned way to write constructors using a constructor initializer

sales_item::sales_item(const string &book):

isbn(book),units_sold(0),revenue(0.0) {}

這個建構函式將成員isbn初始化為形參book的值,將units_sold和revenue初始化為0。與任意的成員函式一樣,建構函式可以定義在類的內部或外部。建構函式初始化式只在建構函式的定義中而不是宣告中指定。

注:建構函式初始化列表是許多相當有經驗的c++程式設計師都沒有掌握的乙個特性。

建構函式初始化列表難以理解的乙個原因在於,省略初始化列表並在建構函式的函式體內對資料成員賦值是合法的。

例如,可以將接受乙個string的sales_item建構函式編寫為:

//legal but sloppier way to write the constructor: no constructor initializer

sales_item::sales_item(const string &book)

這個建構函式給類sales_item的成員賦值,但沒有進行顯式初始化。

不管是否有顯式的初始化式,在執行建構函式之前,要初始化isbn成員。這個建構函式隱式使用預設的string建構函式來初始化isbn。執行建構函式的函式體時,isbn成員已經有值了。該值被建構函式函式體中的賦值所覆蓋。

從概念上講,可以認為建構函式分兩個階段執行:(1)初始化階段;(2)普通計算階段。

計算階段由建構函式函式體中的所有語句組成。

注:不管成員是否在建構函式初始始化列表中顯式初始化,類型別的資料成員總是在初始化階段初始化。初始化發生在計算階段開始之前。

以上的兩個sales_item 建構函式版本具有相同的效果。建構函式體執行結束後,三個資料成員儲存同樣的值。不同之處在於,使用建構函式初始化列表的版本是對資料成員初始化,而沒有定義初始化列表的建構函式版本在建構函式函式體中對資料成員賦值。這個區別的重要性取決於資料成員的型別。

有些成員必須在建構函式初始化列表中進行初始化。對於這樣的成員,在建構函式函式體中對它們賦值不起作用。這樣的成員包括:沒有預設建構函式的類型別的成員、const或引用型別的成員。

因為內建型別的成員不進行隱式初始化,所以對這些成員是進行初始化還是賦值似乎都無關緊要。

注意以下兩個例子:

class constref ;

// no explicit constructor initializer: error ri is uninitialized

constref::constref(int ii)

記住,可以初始化const物件或引用型別的物件,但不能對它們賦值。在開始執行建構函式的函式體之前,要完成初始化。初始化const或引用型別資料成員的唯一機會是在建構函式初始化列表中。

編寫該建構函式的正確方式為

//ok: explicitly initialize reference and const members

constref::constref(int ii): i(ii), ci(i), ri(ii){}

建議:使用建構函式初始化列表

C 類成員變數和建構函式初始化

c 中各種型別的成員變數的初始化方法 c 成員變數 建構函式的初始化順序 c 類中成員變數的初始化總結 成員變數初始化位置 普通變數 建構函式的初始化列表中初始化或者建構函式體內進行賦值 static靜態變數 類外進行初始化 const常量變數 建構函式的初始化列表中初始化 引用變數 建構函式的初始...

c 子類建構函式初始化及父類構造初始化

我們知道,構造方法是用來初始化類物件的。如果在類中沒有顯式地宣告建構函式,那麼編譯器會自動建立乙個預設的建構函式 並且這個預設的建構函式僅僅在沒有顯式地宣告建構函式的情況下才會被建立建立。1.父類沒有宣告建構函式 1 子類也沒有宣告自己的建構函式,則父類和子類均由編譯器生成預設的建構函式。2 子類中...

C 類建構函式初始化列表

建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 你可能以為上面的 將會首先做m y i,然後做m x m y,最後它們有相同的值。但是編譯器先初始化m x,然後是m y,因為它們是按這樣的順序宣告的。結果是m x將有乙個不可 的值。...