開始了C++和注意到您可以通過兩種方式優先於C++初始化變量
int example_var = 3; // with the assignment operator '='
或
int example_var(3); // enclosing the value with parentheses
有沒有理由使用了另一種初始化變量?
開始了C++和注意到您可以通過兩種方式優先於C++初始化變量
int example_var = 3; // with the assignment operator '='
或
int example_var(3); // enclosing the value with parentheses
有沒有理由使用了另一種初始化變量?
第一種形式可以追溯到C時代,而第二種形式是以C++添加的。增加的原因是在某些情況下(特別是構造函數中的初始化列表),第一種形式是不允許的。
這兩者並不完全等同於所有類型,這就是其中一個或另一個可能更有用的地方。第一種形式在語義上意味着從右側創建一個臨時表,然後從該臨時表複製構建變量。第二種形式是直接從參數初始化變量。
它什麼時候重要?
如果沒有從右側到變量類型的隱式轉換,或者如果複製構造函數不可用,則第一種形式將失敗,因此在這種情況下,您將不得不使用直接初始化。
第二種形式可以在比第一,但多個上下文中使用很容易發生的最- 傷腦筋-解析。也就是說,在某些情況下,語法將與函數聲明(而不是常規變量的定義)兼容,並且語言確定在這種情況下,表達式將被解析爲函數聲明:
std::string s = std::string(); // ok declares a variable
std::string s(std::string()); // declares a function: std::string s(std::string(*)())
最後,在C++ 11有第三種形式中,使用大括號:
std::string s{std::string{}};
這種形式具有括號直接初始化的優點,但在同一時間,它是不容易出現誤解。
要使用哪一個?
我會推薦第三個選項,如果可用的話。也就是說,我傾向於首先使用第一個,或者第二個取決於上下文和類型...
他們編譯爲相同的東西。然而,兩者都是變量初始化的一種形式,而不是賦值,這在C中很重要,在C++中很重要,因爲調用了完全不同的函數(構造函數和賦值)。
對於像int
這樣的內置類型,兩者意味着相同。
但是對於自定義數據類型,它們可能意味着不同。第一種格式稱爲複製初始化而第二種稱爲直接初始化。
良好閱讀:
Is there a difference in C++ between copy initialization and direct initialization?
他們的輸出是一樣的... 兩個語法調用拷貝構造函數。 int和其他類似的內置數據類型是一樣的,但用戶定義的數據類型有一些不同。
只要你知道,如果你在自己的類型上測試它,'MyClass obj = 5;'調用構造函數,而不是賦值運算符。我也知道這已經被問過;我會盡力找到它去的地方。 – chris
從技術上講,這些都不是任務。他們是*初始化*。他們定義並初始化一個新變量。將新值分配給現有變量時會發生賦值。 ('int i = 1'是初始化,但是'i = 2'是賦值) – jalf