关于C ++中的二维数组初始化

时间:2011-08-31 08:56:28

标签: c++ initialization aggregate multidimensional-array

对于这个关于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。

2 个答案:

答案 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],是否会进行相同的初始化工作?

是。类型别名不会改变任何内容:此数组与第一个类型具有完全相同的类型(和存储持续时间),并且适用相同的规则。