对于这个关于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 :(得分:3)
现在用0?
初始化这个数组的所有元素
是的
如果初始化列表与实际数组的元素数量不同。然后数组被填零。
会进行相同的初始化工作吗?
是的
这里有相同的流程。
答案 1 :(得分: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),没有 brace-or-equal-initializers 用于非静态数据成员(9.2),没有 私有或受保护的非静态数据成员(第11条),没有基础 类(第10条),没有虚函数。
[n3290: 8.5.1/2]:
当初始化程序初始化聚合时 列表,如8.5.4中所述,初始化列表的元素是 作为聚合成员的初始化者,正在增加 下标或成员订单。每个成员都是从中复制初始化的 对应的初始化子句。如果 initializer-clause 是 转换需要表达式和缩小转换(8.5.4) 表达方式,该程序是不正确的。 [注意:如果是 initializer-clause 本身就是一个初始化列表,成员是 list-initialized,这将导致递归应用 如果该成员是聚合,则在此部分中的规则。 -end note ]
[n3290: 8.5.1/7:]
如果列表中的 initializer-clauses 较少 比聚合中的成员,然后每个成员没有 显式初始化应从空初始化器初始化 清单(8.5.4)。
[n3290: 8.5.4/3:]
[..]否则,如果初始化列表没有 元素,对象是值初始化的。 [..]
[final draft]标准实际上包含类似行为的非规范性示例:
[n3290: 8.5.1/10]:
[..] [示例: [..]另一方面,float y[4][3] = { { 1 }, { 2 }, { 3 }, { 4 } };
初始化
y
的第一列(被视为二维 数组)并将其余部分保留为零。 -end示例]
所以,最终,是的。所有最内层的数组元素都将保存值0
;只是你的{{0}}
并没有真正做到这一点。
假设必须将所有元素显式初始化为0。
好吧,既然你的数组有static
个存储持续时间,那么无论如何它的内存都将被初始化为零,所以这对你自己来说最终是没有意义的。
另外,如果我有以下类型定义:
typedef unsigned char u8;
并且此数组为
static u8 my2dArray[10][20]
,是否会进行相同的初始化工作?
是。类型别名不会改变任何内容:此数组与第一个类型具有完全相同的类型(和存储持续时间),并且适用相同的规则。