2012-11-17 234 views
3

在我的C++入門,第5版,他們43頁約默認初始化(重點煤礦)上說:默認初始化混亂

的對象的價值內置類型是不明確的初始化取決於它在哪裏被定義。 在任何函數體外定義的變量都被初始化爲零。

後來,73頁,他們定義一個新類這樣的:

struct Sales_data { 
    std::string bookNo; 
    unsigned units_sold = 0; 
    double revenue = 0.0; 
}; 

據說這是爲了提供新的標準在類初始化的一個例子。在這種情況下,units_soldrevenue將被初始化爲零。如果他們不是,他們說,變量將被默認初始化。

但這是我的問題:這個課堂初始化有什麼意義?讓他們進行默認初始化有什麼問題?我問的原因是他們已經提到在任何函數體外定義的變量被初始化爲零,在這種情況下,這些變量不在任何函數內 - 它們在類定義中。所以默認初始化應該將這些變量初始化爲零,不是嗎?

+1

數據成員不會**被初始化爲0,因此引用是錯誤的,或者有一些缺失的上下文。 – juanchopanza

回答

1

關於「變量在任何函數體外定義」的第一條語句是指具有靜態鏈接的對象,即在名稱空間中聲明的變量:這些變量是零初始化的。在struct居住的任何地方,struct中的成員都會初始化。如果住在堆棧上或在堆上分配,內置變量將不會初始化沒有分配,例如,像這樣使用時:

void f() { 
    Sales_data data; 
} 

即使沒有在聲明中初始化,他們將獲得零初始化如果struct這樣使用,雖然:

Sales_data global; // <--- the "outside any function body" case 
void f() { 
    Sales_data data0 = {}; 
    Sales_data data1 = Sales_data(); 
    Sales_data data2{}; 
} 

然而,這些都需要由struct的用戶合作,並初始化它們明確地確保值被設置。

2

引用似乎是在錯誤的上下文中。變量可以具有至少3種狀態:

  1. 缺省初始化:變量是基於參數或沒有參數的構造 內部初始化。 值初始化是這種類型的
  2. 在一流的初始化的一個特例:在C++ 11功能,您在 代碼
  3. 未初始化已經提出:變量的初始化不被任何解決 和它可以包含任何垃圾值。某些編譯器可能自動生成0或給出警告