2016-06-08 87 views
0

問題1:C++標準是否保證使用{} /()進行初始化會默認爲「0」?

struct S 
{ 
    size_t size; 
    int j; 
    int k; 
    int l; 
}; 

S s={sizeof(S)}; 

合乎理C++標準說,上面的{}將初始化 「J,K,L」 爲0? 似乎它會做,它是CPP標準的一部分?

問題2:

int main() 
{ 
    int* pi=new int[5]; 
    for(int i=0;i<5;++i) 
     cout<<pi[i]<<','; 
    return 0; 
} 

在這裏,在指針元素數組(PI)未初始化,我的運行結果可能看起來像

6785200,6782912,0,0,0, 

但是,如果我將其更改爲

int main() 
{ 
    int* pi=new int[5]();//use() 
    for(int i=0;i<5;++i) 
     cout<<pi[i]<<','; 
    return 0; 
} 

然後,所有的pi元素都是「0」。似乎「()」會給元素一個「0」值。這是cpp標準的一部分嗎?

我也想給使用其他值 「()」 是這樣的:

int* pi=new int[5](7); 

但它無法編譯。我怎麼能給所有元素具有相同值的數組指針賦予初始化值?

+2

你真的應該問每個問題一個問題。把他們三個混在一起會讓答案更難,而其他人則難以尋找答案。 – SCFrench

+0

@SCFrench「每個問題提出一個問題」。不,我們在初始化規則上不需要十億次置換。 –

+0

睡得很緊的傀儡 - http://meta.stackexchange.com/a/268261 – SCFrench

回答

2

問題1

是,它是由aggregate initialization 特別guarantied:

如果初始化子句的數目是比成員[和鹼基數(自C++ 17以來)]或初始化程序列表是完全空的,其餘成員[和基地(自C++ 17以來)]初始化爲[通過它們的缺省初始值設定項(如果在類定義中提供,否則(因爲C++ 14)]由空列表執行,其執行值初始化。如果引用類型的成員是其餘成員之一,則該程序格式不正確(引用不能進行值初始化)。

問題2

使用std::vector

std::vector<int> pi(5, 7); 
+0

我認爲你需要以某種方式重現rev箱子,或者稍微調整一下引號。如果沒有這些框,很難說「(自C++ 1X以來)」所屬的東西。 –

1

有一個完美的答案,已經問題1,我會回答問題2.

是的,你的觀察是正確的。加()new默認初始化的元素爲值初始化。第一種形式對創建的對象沒有任何作用(因此您可以觀察到隨機數),但是值初始化將初始化成員 - 在這種情況下,會將元素設置爲0。不幸的是,沒有辦法爲動態int數組執行特定的初始化 - 您可以將它們保持爲未初始化或將它們初始化(設爲0)。

使用std::vector解決了這個問題。

相關問題