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