2017-04-12 98 views
0

這裏的變量是1或2,這個編譯器或標準是相關的嗎?C++默認參數構造函數vs內聯初始化優先級

class foo { 
    int val = 1; 

    foo(int bar = 2) : val(bar) {} 
} 
+0

如果你沒有傳遞任何東西給構造函數,它會變成2。 – George

+0

這是2.在這種情況下'= 1'是多餘的。 val'等於1的唯一方法是,如果那是顯式傳遞給構造函數的值。 – Michael

+0

這個使用初始化列表的事實是偶然的。就像你寫了'{foo = bar; }'。此外,您正在使用C++ 11的事實在這裏不是一個相關的問題。 – Michael

回答

1

它是2除非您在調用構造函數時提供了不同的值。 見cpp reference關於非靜態數據成員初始化:

如果一個成員都有一個默認的成員初始化,並在 成員初始化列表出現在構造函數中,默認成員 初始化將被忽略。

1

這個位置:foo(int bar = 2)被稱爲默認參數,

,並允許你調用一個函數沒有提供這樣的說法。

怎麼樣?

如果你這樣做:

foo(100)然後VAL被初始化爲100

,但如果你ommit參數

foo()然後VAL與2

在初始化最後,這個聲明使得這個init成爲多餘的:

int val = 1;