2011-08-31 91 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] = {}'。 –