2013-12-13 55 views
1

我正在學習C++,我已經遇到了以下奇怪的初始化:陣列不與C++中的花括號

如果我初始化類的書陣列說

int my_array[5] = {10} 

每個數組字段仍然初始化爲零,當它應該爲十。

如果我在一個循環中初始化它,它按預期工作

這是怎麼回事?我正在使用Ubuntu並使用g ++編譯

+1

*第一個*之後的每個*字段或每個字段*? –

+0

只有第一個元素是10,其餘的0 – Praetorian

+0

確實,第一個元素是10(在檢查數組內容時我的錯誤是這樣) –

回答

7

您觀察的結果是正確的:根據標準,數組的其餘項被初始化爲0。

+0

是的,我看到這是正確的行爲。我正在使用的教程說,通過使用數組[5] = {0},您可以將所有內容初始化爲零。我錯誤地認爲它可以處理所有的值。 –

+1

@MarkoKacanski該方法對於值0是最佳的,因爲編譯器可以按任意順序分配所有值0,並且實質上優化自身。在增量for循環中執行同樣的操作並不理想,因爲您爲所有元素指定迭代器,順序和值。但是,這是我知道初始化爲非零值的唯一方法。 ('std :: fill_n'在內部工作原理相同) – Trojan

+1

使用'= {0}'與使用'= {}'相同,並且讓編譯器隱式地爲您初始化第一個元素。換句話說,當使用大括號時,您明確指定的任何值都只會將該字段初始化爲該特定值,然後任何未指定的字段將被初始化爲零。所以如果你省略了第一個字段,編譯器會爲你簡單地初始化它。 –

4

當使用小於的列表進行初始化時,只會按照您的預期初始化指定的元素;其餘部分初始化爲0.

要初始化所有值,請使用循環或std::fill_n,如here所示。

std::fill_n(my_array, 5, 10); // array name, size, value 

在內部,std::fill_n相當於一個循環。從第一個環節:

template <class OutputIterator, class Size, class T> 
    OutputIterator fill_n (OutputIterator first, Size n, const T& val) 
{ 
    while (n>0) { 
     *first = val; 
     ++first; --n; 
    } 
    return first;  // since C++11 
} 
6

的C++ 03(假定,如果你有GCC的Ubuntu系統上的舊版本)標準說:

8.5.1/7

如果列表中的初始化器數量少於總數中的成員 ,則未明確初始化的每個成員應該是數值初始化的()。

和陣列是一個聚合:

8.5.1/1

聚集是一個陣列或類(第9節),沒有用戶聲明的 構造( 12.1),沒有私人或受保護的非靜態數據成員 (第11條),沒有基類(第10條),也沒有虛擬函數 (10.3)。

至於什麼值初始化裝置:

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

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

...並且跳過一切int不是...

- 否則,對象是零初始化

這是int類型的變量會發生什麼。

+0

這正是我想發佈的支持信息。你有這個標準的副本嗎?或者你看一些在線資源? – Jarhmander

+0

@Jarhmander只需谷歌它。 – 2013-12-13 21:41:50

+0

那我的谷歌真可怕,我很害怕。 – Jarhmander