標籤:c++11
類通過一個特殊的建構函式來控制預設初始化過程,這個函數就是預設建構函式,預設建構函式無需任何實參。我們可以顯示的定義預設建構函式也可以讓編譯器為我們產生預設建構函式。預設建構函式以如下規則初始化累的資料成員:
- 如果存在類內初始值,用它來初始化成員。
- 否則,預設初始化該成員。
class Sales_data {public:std::string bookNo;unsigned units_sold = 0;double revenue = 0.0;};
如上所示,因為Sales_data為units_sold和revenue提供了初始值,所以合成預設建構函式將使用這些值來初始化對應的成員,而bookNo被預設初始化為一個Null 字元串。
合成預設建構函式只適用於非常簡單的類,通常來說,我們需要為自訂類提供預設建構函式,因為:
- 編譯器只有在發現類不包含任何建構函式的情況下才會替我們產生預設建構函式。一旦我們定義了一些其它的建構函式,除非我們再定義一個預設建構函式,否則這個類將沒有預設建構函式。因為一個類在某種情況下需要控制對象初始化,那麼該類可能需要在所有情況下都控制初始化。
- 合成的預設建構函式可能執行錯誤的操作,比如對複合類型(數組和指標),預設初始化的結果是未定義的。
- 有的編譯器不能為某些類合成預設建構函式,比如類中包含一個其它類類型的成員,且這個成員的類型沒有預設建構函式。
default關鍵字:
class Sales_data {public:Sales_data() = default;Sales_data(const std::string &s) bookNo(s) {}Sales_data(const std::string &s, unsigned n, double p) :bookNo(s), units_sold(n), revenu(p*n) {}Sales_data(std::istream &);std::string isbn() const { return bookNo; }Sales_data& combine(const Sales_data&);double avg_price() const;private:std::string bookNo;unsigned units_sold = 0;double revenue = 0.0;};
在C++11標準中,如果我們需要預設的行為,可以通過在參數列表後來要求編譯器產生預設建構函式。default既可以和聲明一起出現在類的內部,也可以作為定義出現在類的外部。如果=default在類的內部,則預設建構函式是內聯的,如果它在類的外部,則該成員函數預設情況下不是內聯的。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
[C++11] 預設建構函式