【问题标题】:Regarding 2-d array initialisation in C++关于 C++ 中的二维数组初始化
【发布时间】:2011-08-31 08:56:27
【问题描述】:

对于这个关于 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 是强制性的。

【问题讨论】:

  • 你是什么意思,你得到了不同的反应?你已经问过了,还是什么?
  • 是的,我之前在堆栈溢出以及亲自问过同事。那时我得到了不同的反应。
  • 希望我的回答能让你满意。

标签: c++ initialization aggregate multidimensional-array


【解决方案1】:

现在这个数组的所有元素都用 0 初始化了吗?

是的
如果初始值设定项列表的元素数量与实际数组不同。然后数组是零填充的。

同样的初始化是否有效?

是的
同样的过程在这里起作用。

【讨论】:

  • 这是否类似于 char a[10] = {0} 用 0 填充一维数组的所有元素?这是我第一次尝试二维数组。另外,如果这是类指针数组,我应该用 {} 初始化一维,用 {{}} 初始化二维?
  • @kiki:你应该知道你的0 没有什么神奇之处; char a[10] = {1} 将第一个元素初始化为 1,其余的都是值初始化的……也就是说,它们被初始化为 0。即,您在此处提供的值 not 是一个将通过所有数组元素传播的值。因此,您的char a[10] = {0} 也可能是char a[10] = {}
【解决方案2】:
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],同样的初始化工作吗?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2011-09-29
    • 2011-12-26
    • 2012-11-29
    相关资源
    最近更新 更多