首頁  >  問答  >  主體

c++什么时候应该在成员变量定义的时候直接赋值而不是构造函数赋初值?

class A {
public:
    int _a = 2; //直接赋值
    A(){}
}

什么情况下应该这样赋值,什么情况下应该在构造函数里赋值?

怪我咯怪我咯2714 天前557

全部回覆(5)我來回復

  • 怪我咯

    怪我咯2017-04-17 13:32:47

    class A {
    public:
        int _a = 2; // 类内初始化
        A(){}
    }

    這樣的寫法與

    class A {
    public:
        int _a;
        A() : _a(2) {}  // 构造函数初始化列表
    }

    效果相同,賦初值的過程都會發生在建構子的成員初始化階段,前者只是 C++11 增加的語法糖。這樣如果類別有多個建構函式的時候,如果一個成員的初值在這些建構函式中相同,那麼就可以透過類別內初始化的方式設定初值,減少重複勞動。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:32:47

    就地初始化(「直接賦值」)比較好,簡潔明了

    回覆
    0
  • 迷茫

    迷茫2017-04-17 13:32:47

    我猜你應該是想在每一個類別初始化的時候就把_a賦值為2吧?
    這種情況就把int _a = 2寫到A的預設建構子裡面好了。

    A(){_a = 2;}

    還是說你想多個類別的實例共用一個_a變數?
    這種情況你應該用static關鍵字

    static int _a;

    也要注意一下存取權

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 13:32:47

    就地初始化

    這個比較方便的是可以直接在聲明的時候使用type var=?或者type var{}賦值,可以擺脫一個為了初始化而寫構造函數的麻煩,不過這需要最新的c++11標準才行,相對於初始化列表,不用再為了擺脫編譯器的初始化與宣告順序不一致的警告(這有時候其實是非常危險的)調整變數在初始化列表中的順序。

    struct Init
    {
        int x = 11;
        int z {10};
    };

    初始化清單

    初始化列表是一種非常「古老」的初始化方式,相對於就地初始化優勢也很明顯,並不需要什麼新特性支持,c++所有版本都能支持,還有一個好處就是可以用來委托构造(c++11)。

    struct InitList
    {
        InitList()
            :InitList(10, 11)
        {}
        
        InitList(int x, int z)
            :x(x)
            ,z(z)
        {}
        
        int x;
        int z;
    };

    至於用什麼是屬於個人習慣的問題,初始化清單更通用一些,目前也可以結合兩者一起使用。

    注意:當一個成員在初始化清單和就地初始化同時存在時,初始化清單優先執行,就地初始化會被忽略。

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 13:32:47

    類內初始值會被轉寫進構造函數裡
    所以並沒有任何區別
    由於寫了類內初始值的成員的初始化順序依然會按默認順序,所以我推薦不寫類內初始值

    回覆
    0
  • 取消回覆