[C++11] 預設建構函式

來源:互聯網
上載者:User

標籤: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] 預設建構函式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.