在試圖回答this問題,我發現代碼int* p = new int[10]();
編譯罰款與VC9編譯器和初始化的整數爲0。所以,我的問題是:是新的int [10]()有效的C++嗎?
- 首先是這個有效的C++或者是 它微軟延期?
- 它是否保證初始化數組的元素的所有 ?
- 另外,如果我 做
new int;
或new int();
是否有任何區別? 後者保證初始化 的變量嗎?
在試圖回答this問題,我發現代碼int* p = new int[10]();
編譯罰款與VC9編譯器和初始化的整數爲0。所以,我的問題是:是新的int [10]()有效的C++嗎?
new int;
或new int();
是否有任何區別? 後者保證初始化 的變量嗎?首先是這個有效的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
不會初始化的內存。
如果我可以推測將會有點(我敢肯定,如果我錯了,我會被糾正):
後者()也值初始化(因爲它被稱爲在standardese),這使得在這種情況下整數的值爲0。
這是對標準(C++ 03?)的一個相當新的補充,所以舊的編譯器可能不支持它,並且保持它的獨立性。
我記得當從MSVS 2003切換到2005(我認爲)時,得到了很多警告w.r.t,編譯器說「這個成員現在不會被初始化,現在不是這樣」。
從標準。 「默認初始化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*
是一個內置類型,它被初始化爲零。
但我真的不確定。
這是有效的C++根據段落5.3.4/1,這是很難在這裏引用由於特殊格式。
根據5.3.4/15的產品值初始化,如果使用形式(),見第8.5但短答案是肯定的。
是的,在第一種情況下,變量不是價值初始化的,可以是任何東西,第二種情況下它的值初始化爲零。
儘管MSVS已經變得更符合每個版本的標準,但是沒有像C++ 03標準那樣的東西。 – Gorpik 2010-03-18 08:58:28
@Gorpik,目前的標準是ISO/IEC 14882:2003,如果你在一年之前使用命名標準的通用規則,它將是C++ 03,即使這不是正確的名稱(因爲下一個標準將會肯定不會被稱爲C++ 11,即使大多數人會這樣稱呼它) – 2010-03-18 09:28:50
對不起,你是對的。我忘記了2003年發佈的標準修正案。 – Gorpik 2010-03-21 22:37:57