2011-08-31 90 views
0

我在C++中對二維數組初始化的這個問題得到了混合響應。關於C++中的二維數組初始化

這裏的情景:

class MyClass { 
    private: 
     static char my2dArray[10][20]; 
}; 

char MyClass::my2dArray[10][20] = {{0}}; 

現在,這是否初始化這個數組0的所有元素?

而且,如果我有以下類型定義:

typedef unsigned char u8; 

這陣是static u8 my2dArray[10][20],將相同的初始化工作?

假設它是強制性的,所有的元素都明確初始化爲0

+0

你是什麼意思,你得到混合的迴應?你有沒有問過它,或者什麼? –

+0

相關:http://stackoverflow.com/questions/6545012/regarding-empty-initialisation-of-static-array-of-class-types –

+0

是的,我曾問過在堆棧溢出以及同事親自。那是當我得到混合反應時。 – kiki

回答

2
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],將相同的初始化工作?

是的。類型別名不會改變任何內容:這個數組與第一個類型具有完全相同的類型(和存儲持續時間),並且適用相同的規則。

+1

+1用於查看「靜態」 – oenone

3

現在這並初始化這個數組0的所有元素?


如果初始化列表中不具有相同數量的元素作爲實際陣列。然後數組被填滿。

會一樣的初始化工作嗎?


相同的過程在這裏工作。

+0

這與char a [10] = {0}如何用0填充1-d數組的所有元素相似嗎?這是我第一次嘗試2D陣列。另外,如果這是類指針數組,我應該用{}爲1-d和{{}}初始化2-d? – kiki

+1

@kiki:你應該知道,在那裏你的'0'沒有什麼神奇的; 'char a [10] = {1}'將第一個元素初始化爲'1',其餘所有元素都進行了值初始化...即它們被初始化爲'0'。即您給出的值不是一個將傳播通過所有數組元素的值。因此,你的'char a [10] = {0}'也可能是'char a [10] = {}'。 –