這裏的變量是1或2,這個編譯器或標準是相關的嗎?C++默認參數構造函數vs內聯初始化優先級
class foo {
int val = 1;
foo(int bar = 2) : val(bar) {}
}
這裏的變量是1或2,這個編譯器或標準是相關的嗎?C++默認參數構造函數vs內聯初始化優先級
class foo {
int val = 1;
foo(int bar = 2) : val(bar) {}
}
它是2
除非您在調用構造函數時提供了不同的值。 見cpp reference關於非靜態數據成員初始化:
如果一個成員都有一個默認的成員初始化,並在 成員初始化列表出現在構造函數中,默認成員 初始化將被忽略。
這個位置:foo(int bar = 2)
被稱爲默認參數,
,並允許你調用一個函數沒有提供這樣的說法。
怎麼樣?
如果你這樣做:
foo(100)
然後VAL被初始化爲100
,但如果你ommit參數
foo()
然後VAL與2
在初始化最後,這個聲明使得這個init成爲多餘的:
int val = 1;
如果你沒有傳遞任何東西給構造函數,它會變成2。 – George
這是2.在這種情況下'= 1'是多餘的。 val'等於1的唯一方法是,如果那是顯式傳遞給構造函數的值。 – Michael
這個使用初始化列表的事實是偶然的。就像你寫了'{foo = bar; }'。此外,您正在使用C++ 11的事實在這裏不是一個相關的問題。 – Michael