2010-03-18 37 views
26

在試圖回答this問題,我發現代碼int* p = new int[10]();編譯罰款與VC9編譯器和初始化的整數爲0。所以,我的問題是:是新的int [10]()有效的C++嗎?

  1. 首先是這個有效的C++或者是 它微軟延期?
  2. 它是否保證初始化數組的元素的所有 ?
  3. 另外,如果我 做new int;new int();是否有任何區別? 後者保證初始化 的變量嗎?

回答

29

首先是這個有效的C++或者是Microsoft擴展?

它是在C時有效++,標準的相關部分是5.3.4,用含有語法

是它保證初始化數組的所有元素第一段?

是的。款5.3.4/15指出

的新表達式創建類型T的對象初始化該對象如下:

...

  • 如果新的初始值設定爲形式()的,該項目是值初始化(8.5)

其中用於POD初始化值意味着零初始化。

此外,有沒有,如果我做新的INT任何區別;或新的int();?後者是否保證初始化變量?

是的,他們是不同的。根據上面的報價new int()將零初始化整數。在同一段的前一個塊:

如果省略了新初始化:

  • 如果T是(可能CV修飾)非POD類類型(或其陣列) ,對象被默認初始化(8.5)。如果T是一個const限定類型,則底層類類型應該有一個用戶聲明的默認構造函數。

  • 否則,創建的對象具有不確定的值。如果T是一個常量限定類型,或(可能CV修飾)POD類類型(或其陣列)含有(直接或間接)const限定類型的一個成員,該程序是形成不良的;

所以new int不會初始化的內存。

0

如果我可以推測將會有點(我敢肯定,如果我錯了,我會被糾正):

後者()也值初始化(因爲它被稱爲在standardese),這使得在這種情況下整數的值爲0。

這是對標準(C++ 03?)的一個相當新的補充,所以舊的編譯器可能不支持它,並且保持它的獨立性。

我記得當從MSVS 2003切換到2005(我認爲)時,得到了很多警告w.r.t,編譯器說「這個成員現在不會被初始化,現在不是這樣」。

+0

儘管MSVS已經變得更符合每個版本的標準,但是沒有像C++ 03標準那樣的東西。 – Gorpik 2010-03-18 08:58:28

+3

@Gorpik,目前的標準是ISO/IEC 14882:2003,如果你在一年之前使用命名標準的通用規則,它將是C++ 03,即使這不是正確的名稱(因爲下一個標準將會肯定不會被稱爲C++ 11,即使大多數人會這樣稱呼它) – 2010-03-18 09:28:50

+0

對不起,你是對的。我忘記了2003年發佈的標準修正案。 – Gorpik 2010-03-21 22:37:57

2

從標準。 「默認初始化T類型的對象意味着: - 如果T是非POD類類型 [類似於vector的情況],則調用T的默認構造函數。」

構造函數表示法T()用於表示類型T的默認值,對於內置類型和用戶定義類型的默認構造方法,它是0。構造POD()產生值初始化並根據stdandard,其導致所有成員和子成員是默認構造的或零初始化的。

這就是爲什麼您的聲明是合法的,但它是按照標準初始化爲零;需要一些詳細的查詢恕我直言。

但是,我不能在標準尋找到它定義默認建設意義的內建類型

編輯: -

struct S { int x; }; 

void f() { 
    S s1;  // s1.x is uninitialized here 
    S s2 = S(); // s2.x is zero here 
} 

我認爲,我們經常做我們自己的東西默認構造適用於內建類型指解釋;因爲C++標準沒有定義它(至少我無法找到它)和i記得Stroustrup的約祖蒂斯說它是指被描述爲值初始化T()爲「零轉換爲T類型」爲內置類型。

由於int*是一個內置類型,它被初始化爲零。

但我真的不確定。

+1

這真的是一個初始化列表嗎?我認爲那些{1,2,3}? – Macke 2010-03-18 08:52:25

+0

@Abhay:§8.5與這個問題無關。正如Marcus Lindblom正確指出的那樣,初始值設定項列表的形式爲「{1,2,3}」,並且不能在新的表達式中使用(在當前標準中)。新表達式的初始化規則屬於§5.3.4[expr.new] – 2010-03-18 09:12:34

+0

@dribeas:是的,編輯帖子,但是我在OP的分配數組來獲取初始化部分的背景下冒險進入它。我的錯誤:-( – Abhay 2010-03-18 09:17:40

1
  1. 這是有效的C++根據段落5.3.4/1,這是很難在這裏引用由於特殊格式。

  2. 根據5.3.4/15的產品值初始化,如果使用形式(),見第8.5但短答案是肯定的。

  3. 是的,在第一種情況下,變量不是價值初始化的,可以是任何東西,第二種情況下它的值初始化爲零。