2012-08-28 165 views
3

出於某種原因,我有這個想法,C和C++的工作是這樣的:初始化列表和C++

int foo[10] = {57}; 
for (int i=0; i<10; ++i) 
    assert (foo[i] == 57); 

原來剩下的整數被初始化爲0,而不是57.在哪裏我得到這個想法?這是真的嗎?結構初始化列表是否真的如此?數組和結構在分配給= {}和= {0}時整齊,正確地開始將自己初始化爲0值的時候?除非明確告知,否則我一直認爲他們會初始化爲垃圾。

+0

他們初始化爲垃圾(未初始化)如果你不sp確定任何初始化。也就是'int foo [10];' – enobayram

+0

Aside:如果你希望它們都是57,你可以(用C++):'int foo [10]; std :: fill(begin(foo),end(foo),57);' – chris

+0

[C如何初始化一個數組](http://stackoverflow.com/questions/201101/how-to-initialize -an-array-in-c) –

回答

10

只要初始化符存在,就一直這樣。 C89說:

如果有比有一個 聚集的成員名單少初始化中,總的剩餘部分將被初始化 隱含一樣具有靜態存儲持續時間的對象。

+0

我從來不知道靜態持續時間基元也初始化爲0。很有意思!謝謝! – cppguy

2

我從哪裏得到這個想法?

這顯然是一個比較常見的誤解,因爲我最近聽到了許多其他人的同樣的事情。也許你從其他人那裏拿出了這個錯誤的想法,或者這個想法只是'直覺'。

{}初始化的工作原理至少可以追溯到C89。我沒有意識到它的工作方式不同,或者說有任何不同的編譯器。

對於初始化列表初始化一個聚合類型(如陣列)時:如果有較少的初始化子句在列表以外還有在聚集構件,然後不明確初始化每個部件應是

從空初始化列表(8.5.4)初始化。 —骨料[dcl.init.aggr] 8.5.1p7

在C++術語,當使用一個空的初始化的對象是值初始化。

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

- 如果T是一個(可能是CV-合格)類型(第9節)與 用戶提供的構造(12.1) ,那麼T 的默認構造函數被調用(並且如果T沒有可訪問的 默認構造函數,則初始化不合格);

- 如果T是一個(可能CV修飾)非工會類型不具有 用戶提供的構造函數,則該對象被初始化爲零,並且如果 T的隱式地聲明的默認的構造是不平凡的,那 構造函數被調用。

- 如果T是一個數組類型,則每個元素都進行了值初始化;

- 否則,該對象是零初始化的。

                                                                                                                                                                                            —初始化器[dcl.init] 8.5p7

+0

是的,我最近了解到這個關於模板的事實。不知道還有其他的情況。謝謝! – cppguy

+0

很酷的解釋 – cnicutar