出於某種原因,我有這個想法,C和C++的工作是這樣的:初始化列表和C++
int foo[10] = {57};
for (int i=0; i<10; ++i)
assert (foo[i] == 57);
原來剩下的整數被初始化爲0,而不是57.在哪裏我得到這個想法?這是真的嗎?結構初始化列表是否真的如此?數組和結構在分配給= {}和= {0}時整齊,正確地開始將自己初始化爲0值的時候?除非明確告知,否則我一直認爲他們會初始化爲垃圾。
出於某種原因,我有這個想法,C和C++的工作是這樣的:初始化列表和C++
int foo[10] = {57};
for (int i=0; i<10; ++i)
assert (foo[i] == 57);
原來剩下的整數被初始化爲0,而不是57.在哪裏我得到這個想法?這是真的嗎?結構初始化列表是否真的如此?數組和結構在分配給= {}和= {0}時整齊,正確地開始將自己初始化爲0值的時候?除非明確告知,否則我一直認爲他們會初始化爲垃圾。
只要初始化符存在,就一直這樣。 C89說:
如果有比有一個 聚集的成員名單少初始化中,總的剩餘部分將被初始化 隱含一樣具有靜態存儲持續時間的對象。
我從來不知道靜態持續時間基元也初始化爲0。很有意思!謝謝! – cppguy
我從哪裏得到這個想法?
這顯然是一個比較常見的誤解,因爲我最近聽到了許多其他人的同樣的事情。也許你從其他人那裏拿出了這個錯誤的想法,或者這個想法只是'直覺'。
{}
初始化的工作原理至少可以追溯到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
他們初始化爲垃圾(未初始化)如果你不sp確定任何初始化。也就是'int foo [10];' – enobayram
Aside:如果你希望它們都是57,你可以(用C++):'int foo [10]; std :: fill(begin(foo),end(foo),57);' – chris
[C如何初始化一個數組](http://stackoverflow.com/questions/201101/how-to-initialize -an-array-in-c) –