2012-01-14 127 views
10

可能重複:
What do the following phrases mean in C++: zero-, default- and value-initialization?「值初始化」是什麼意思?

如果我有例如一個類:

class Info 
{ 
    int x; 
    int y; 
}; 

這在我以前創建的對象,

Info *p = new Info(); 

Info旁邊的括號是否表示我正在初始化它的值?它與此有何不同,Info *p = new Info;

我知道有一個question區分新舊C++語言中的不同含義,但我想知道默認值和值初始值之間的語義差異,例如值初始化意味着什麼東西初始化爲零?

+0

[以下短語在C++中意味着什麼:零,初始值和初始值?](http://stackoverflow.com/questions/1613341 /),[C++ 03中default-initialize和value-initialize的區別?](http://stackoverflow.com/questions/7084831/)。 – outis 2012-01-14 07:21:32

回答

19

聲明的變量可以是零初始化值進行初始化默認情況下初始化

在您的例子:

Info *p = new Info(); <------- Value Initialization 
Info *p = new Info;  <------- Default Initialization 

的C++ 03標準8.5/5恰當地定義了每個:

零初始化類型T的對象是指:

- 如果T是標量類型(3.9),則將該對象設置爲轉換爲T的值0(零);
- 如果T是非聯合類類型,則將每個非靜態數據成員和每個基類子對象0初始化;
- 如果T是聯合類型,則該對象的第一個命名數據成員是零初始化的;
- 如果T是一個數組類型,每個元素都是零初始化的;
- 如果T是參考類型,則不執行初始化。

缺省初始化類型T的對象是指:
- 如果T是一個非POD類型(第9節),T的默認構造函數被調用(並形成不良的 初始化如果T沒有可訪問的默認構造函數);
- 如果T是一個數組類型,則每個元素都默認初始化;
- 否則,該對象是零初始化的。

值初始化類型T的對象是指:
- 如果T是一個類型(第9節)與用戶聲明的構造(12。1),那麼調用T的默認構造函數 (並且如果T沒有可訪問的默認構造函數,則初始化不合格);
- 如果T是一個沒有用戶聲明構造函數的非聯合類類型,那麼T的每個非靜態數據成員和基類組件都進行了值初始化;
- 如果T是一個數組類型,那麼每個元素都進行了值初始化;
- 否則,該對象是零初始化的

+0

Als - 非常好的答案 - 保存我打字! – 2012-01-14 07:33:53

+0

在我的例子中,class Info是POD類的類型。這是否意味着默認初始化將是零初始化? – user1086635 2012-01-14 07:38:48

+0

@ user1086635:是的。在上面的標準報價的第二段中明確提到了這一點。 – 2012-01-14 07:42:55