c 初始化列表

2021-10-05 07:14:49 字數 1869 閱讀 6118

在網上看到許多類似的部落格內容,許多都是**的,我不知道他們驗證過沒有,反正我試了之後發現,這根本不對,原內容如下:

我持著懷疑的態度去驗證,發現即使用大括號來初始化,也不會呼叫預設建構函式,**如下(沒有任何輸出):

class

animal

/*animal(int weight, int height) : //方法1

m_weight(weight),

m_height(height)

*/animal

(int weight,

int height)

//方法2

private

:int m_weight;

int m_height;};

intmain()

然後我又用其它方法驗證:對上述方法1和方法2,主函式改動如下:

int

main()

_stop =

clock()

; cout <<

(double

)( _stop - _start )

/ clocks_per_sec << endl;

}

經過多次執行,兩種方法的時間都大致為0.238秒左右,並沒有較大波動,也就是說,使用方法2,並沒有呼叫預設建構函式來浪費額外的時間。

那麼,方法1,也就是初始化列表的作用是什麼呢?據我的理解,有如下兩點:

1、初始化父類

現在給父類加乙個派生類dog:

class

animal

/*animal(int weight, int height) : //方法1

m_weight(weight),

m_height(height)

*/animal

(int weight,

int height)

//方法2

private

:int m_weight;

int m_height;};

class

dog:

public animal;~

dog();

private

:int da, db;

};

此時如果,main函式裡面像下面這麼寫肯定沒問題:

int

main()

但如果把方法1上面的那個無參建構函式(作用等於預設建構函式)給注釋掉,那麼就會報錯,錯誤為無法找到父類的預設建構函式,那麼怎麼辦,此時初始化列表的第乙個作用就出來了, 可以給dog類這麼加:

class

dog:

public animal;~

dog();

private

:int da, db;

};

注意,如果進入大括號,則意味著父類已經初始化完,因此只能這麼幹。

這裡再囉嗦兩句初始化順序的問題,具體就不用**展開來試驗了,已經我都驗證過:初始化列表的初始化順序與變數定義的順序一致或類繼承順序一致,如果變數初始化時用到了位於同一列表的其它剛剛被初始化的變數,那這點尤為要注意。

2、初始化列表的第二個作用:

這個簡單說一下,就是可以用來初始化類中的const常量和初始化引用等,因為const的量和引用這種只能被初始化一次,後面就不能更改了,因此只能在初始化列表中解決。而且不在這裡解決,編譯都過不去。

c 初始化列表

與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。struct foo 初始化列表 建構函式的兩個執行階段 從概念上來講,建構函式的執行可以分成兩個階段,初始化階段和計算階段,初始化階段先於計算階段 初始化階段 所有...

C 初始化列表

與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。在c 中,struct和class的唯一區別是預設的克訪問性不同,而這裡我們不考慮訪問性的問題,所以下面的 都以struct來演示。struct foo 初始化列表 ...

C 初始化列表

與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。struct foo 初始化列表 建構函式的執行可以分成兩個階段,初始化階段和計算階段,初始化階段先於計算階段。所有類型別 class type 的成員都會在初始化階...