這是乙個很好的嘗試,並且幾乎是正確的想法。我們一定要新增另乙個引數我們的建構函式,否則c++將沒有辦法知道什麼需要的值初始化m_nvalue來。
然而,c++類繼承的成員變數的初始化可以在建構函式的初始化列表。換句話說,乙個變數的值只能被設定在乙個建構函式屬於同一類的變數初始化列表。
為什麼c++這樣做嗎?答案與const引用變數。考慮會發生什麼,如果m_nvalue是const。因為const變數必須在建立時的值初始化,基類的建構函式必須設定它的值時,建立變數。然而,當基類建構函式完成的派生類建構函式初始化列表,然後執行。每個派生類將有機會初始化這個變數,它的值可能會改變!通過限制變數的初始化類的建構函式的變數屬於,c++確保所有變數被初始化一次。
最終的結果是,上面的例子不工作,因為m_nvalue是繼承的基礎,只有非繼承的變數可以在初始化列表的更改。
然而,遺傳變數還可以更改其值在建構函式函式體中的賦值。因此,新的程式設計師也經常嘗試:
123
4567
891011
class derived: public base
};
而這其實是在這種情況下,它不會工作,如果m_nvalue是const或引用(const值和引用,因為必須在建構函式初始化列表初始化)。這也是因為m_nvalue低效得到分配乙個值的兩倍:一旦在基類建構函式的初始化列表,然後再在派生類的建構函式體。
那麼我們如何正確初始化m_nvalue當建立派生類物件?
在所有的例子到目前為止,當我們例項化乙個派生類物件的基類部分,已使用預設建構函式建立的基礎。為什麼它總是使用預設基類建構函式?因為我們從來沒有告訴它做否則!
幸運的是,c + +讓我們能夠明確地選擇哪個基類建構函式會被呼叫!要做到這一點,只需新增乙個**在派生類的基類建構函式初始化列表:
初始化 1 預設初始化 列表初始化
初始化的基本概念 事實 初始化和賦值是兩個完全不同的操作。初始化,是建立變數時賦予其乙個初始值。賦值,是把物件的當前值擦除,用乙個新值代替。列表初始化 p39 作為c 11新標準的一部分,用花括號 來初始化變數得到了全面應用。出於某些原因,這種初始化的方式叫做列表初始化。現在,無論是初始化物件還是某...
初始化列表
與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。在c 中,struct和class的唯一區別是預設的克訪問性不同,而這裡我們不考慮訪問性的問題,所以下面的 都以struct來演示。struct foo 初始化列表 ...
初始化列表
初始化列表一般用於建構函式賦值的操作中,它的常用賦值物件有 1 常量 常資料成員只能用初始化列表來初始化 2 引用型別 3 無參建構函式的類的物件。具體格式為 類名 形參表 如int x,int y 成員資料 x 成員資料 y 意思是成員資料繫結x,y。下面以幾個例子來說明一下 一 求圓面積 inc...