class MyClass {
private:
static char my2dArray[10][20];
};
char MyClass::my2dArray[10][20] = {{0}};
现在这个数组的所有元素都用 0 初始化了吗?
有点。
回想一下,数组的元素不是char,而是char[10](不能是0)。
您在这里所做的是通过为 first 内部数组提供初始化程序来初始化外部数组({0},再次仅设置内部数组的 first 元素到0)。
然后,您将让“默认”的隐式初始化行为接管两个数组中的后续元素。
[n3290: 8.5.1/1]: 聚合是一个数组或一个类(第 9 条)
没有用户提供的构造函数(12.1),没有
brace-or-equal-initializers 用于非静态数据成员 (9.2),否
私有或受保护的非静态数据成员(第 11 条),无基础
类(第 10 条),并且没有虚函数。
[n3290: 8.5.1/2]: 当聚合被初始化器初始化时
列表,如 8.5.4 中所指定,初始化列表的元素是
作为聚合成员的初始化器,在增加
下标或成员顺序。每个成员都从
相应的初始化子句。如果 initializer-clause 是
表达式和缩小转换 (8.5.4) 需要转换
表达式,程序格式错误。 [ 注意:如果
initializer-clause 本身就是一个初始化列表,成员是
列表初始化,这将导致递归应用
如果成员是聚合成员,则在本节中列出规则。 —结束说明 ]
[n3290: 8.5.1/7:]如果列表中的initializer-clauses较少
比总成员数多,则每个成员不
显式初始化应从空初始化程序初始化
列表 (8.5.4)。
[n3290: 8.5.4/3:] [..] 否则,如果初始化列表没有
元素,对象是值初始化的。 [..]
[最终草案] 标准实际上包含一个类似行为的非规范示例:
[n3290: 8.5.1/10]: [..] [ 示例: [..] 另一方面,
float y[4][3] = { { 1 }, { 2 }, { 3 }, { 4 } };
初始化y的第一列(视为二维
数组)其余为零。 —结束示例]
所以,最终,是的。所有最里面的数组元素都将保存值0;只是你的 {{0}} 实际上并没有做太多事情来实现这一点。
假设所有元素都显式初始化为 0 是强制性的。
好吧,既然你的数组有static的存储持续时间,它的内存无论如何都会被初始化为零,所以这最终是没有意义的。
另外,如果我有以下类型定义:
typedef unsigned char u8;
而这个数组是static u8 my2dArray[10][20],同样的初始化工作吗?
是的。类型别名不会改变任何东西:这个数组与第一个数组具有完全相同的类型(和存储持续时间),并且适用相同的规则。