在網上看到許多類似的部落格內容,許多都是**的,我不知道他們驗證過沒有,反正我試了之後發現,這根本不對,原內容如下:
我持著懷疑的態度去驗證,發現即使用大括號來初始化,也不會呼叫預設建構函式,**如下(沒有任何輸出):
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 的成員都會在初始化階...