首頁  >  問答  >  主體

C++类内初始化与初始化列表

天蓬老师天蓬老师2764 天前891

全部回覆(2)我來回復

  • 高洛峰

    高洛峰2017-04-17 13:00:14

    如@GAO 所說,C++11的類別內初始化允許非static成員的初始化,可以用{}或=號。
    建構函式的初始化列表 與 類別內成員初始化 沒有誰好誰不好,誰來替代誰,兩種方法可互相補充使用。類別內初始化有一些好處:
    1、當你有多個建構子時,如果使用初始化列表,每個建構函式都要寫一遍,煩人不說,同時產生重複程式碼,修改易漏。如果把這些成員都用類別內初始化,初始化列表就不用再列出它們了。
    2、類內初始化,成員之間的順序是隱式的,會有些便利。如果使用初始化列表,它是有順序之分的,順序不對,編譯器會警告。
    3、對於簡單的類別或結構,沒有建構子的,可以直接用類別內初始化在成員宣告的同時直接初始化,方便。

    對於某些類別類型的成員初始化要小心,如果成員之間有依賴關係,這時使用初始化列表明確的指明這些成員的構造(初始化)順序是比較穩健的。

    如果成員已經使用了類別內初始化,但在建構函式的初始化列表又列出來,編譯器以後者優先,類別內初始化會被忽略。如果某些成員使用不同建構函式時,會有不同的預設值,這種情況就要用初始化列表。同時,其它成員仍可使用類別內初始化。

    類別內初始化絕對不是解決什麼內建型別預設初始化時未定義問題。物件導向程式設計一個很重要的原則,程式設計師有責任保證物件產生出來,它的每個成員都必須是初始化的,這是設計問題以及基本意識,無論是使用哪種方法初始化。

    回覆
    0
  • PHPz

    PHPz2017-04-17 13:00:14

    好像C++11之後就支援類別內初始化了,在先前類別內初始化是不允許的

    class A{
        static const int a = 7; //C++98允许
        int b = 8; //C++11允许,而98不允许
    }

    我個人認為類別內初始化將會隨著C++11 成為主流。

    回覆
    0
  • 取消回覆