class MyClass {
private:
static char my2dArray[10][20];
};
char MyClass::my2dArray[10][20] = {{0}};
現在這是否初始化這個陣列0的所有元素?
的排序。
回想一下,您陣列的元素不是char
,而是char[10]
(不能是0
)。
你在這裏做什麼是通過提供初始化器爲第一內陣列({0}
,只有內陣列的第一元素重新設置到0
)初始化外陣列。
然後,您讓「默認」隱式初始化行爲接管兩個數組中的後續元素。
[n3290: 8.5.1/1]:
的骨料是一個數組或類(第9節) 沒有用戶提供的構造(12.1),無 撐 - 或等於-初始化用於非靜態數據成員(9.2),否 私有或受保護的非靜態數據成員(第11章),無基礎 類(第10章),並且沒有虛函數。
[n3290: 8.5.1/2]:
當一個聚合由初始化程序 列表初始化時,如8.5所述。4,初始化程序列表的元素爲 ,作爲聚合成員的初始化程序,增加 下標或成員順序。每個成員都從 對應的初始化子句複製初始化。如果初始化子句是 表達式,並且需要使用縮小轉換(8.5.4)將該表達式轉換爲 ,則該程序是格式不正確的。 [注:如果 初始化子句本身是一個初始化列表,該構件是 列表初始化,這將導致的 規則本節中的遞歸應用,如果構件是聚集。末端注]
[n3290: 8.5.1/7:]
如果在列表 以外還有總成員有較少初始化從句,然後每個成員不 明確初始化應從空初始化初始化 名單(8.5.4)。
[n3290: 8.5.4/3:]
[..]否則,如果初始化程序列表中沒有 元素,則對該對象進行值初始化。 [..]
的〔最後草案]標準實際上包含一個類似的行爲的非規範例如:
[n3290: 8.5.1/10]:
[..] [例: [..]在另一方面,
float y[4][3] = { { 1 }, { 2 }, { 3 }, { 4 } };
初始化的y
的第一列(被視爲二維 陣列)和LEA其餘爲零。末端示例]
因此,最終,是的。所有最內層的數組元素都將保存值0
;這只是你的{{0}}
並沒有真正做到這一點。
假設它是強制性的,所有的元素都明確初始化爲0
好吧,既然你的陣列有static
存儲時間,它的內存將是無論如何零初始化,所以這是最終毫無意義地打擾你自己。
而且,如果我有以下類型定義:
typedef unsigned char u8;
這陣是static u8 my2dArray[10][20]
,將相同的初始化工作?
是的。類型別名不會改變任何內容:這個數組與第一個類型具有完全相同的類型(和存儲持續時間),並且適用相同的規則。
你是什麼意思,你得到混合的迴應?你有沒有問過它,或者什麼? –
相關:http://stackoverflow.com/questions/6545012/regarding-empty-initialisation-of-static-array-of-class-types –
是的,我曾問過在堆棧溢出以及同事親自。那是當我得到混合反應時。 – kiki