在构造函数中对数组数据成员进行零初始化

新手上路,请多包涵

我有一个类对象数组,在类对象内部我有另一个数组,我需要将其初始化为全零。代码编译并运行,但我的输出显示 C 而不是 0。

从头文件:

 class Cache {
private:
    int byte[16];
public:
    Cache();
    int getBytes(int);
    ~Cache();
};

来自 cpp 文件

Cache::Cache()
{
    byte[16]={0};
}

int Cache::getBytes(int j){
    return byte[j];
}

从另一个 cpp 文件

for (int i = 0; i < 16; i++)
{
    for (int j = 0; j < 16; j++)  //visual check of initializes main memory
    {
        cout << cache[i].getBytes(j) << " ";
}
}

这是正确设置的吗?正如我所提到的,getBytes 按预期返回’C’而不是’0’。

原文由 Anik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 474
2 个回答

只需在构造函数初始化列表中使用 值初始化 即可。这是在 C++ 中执行此操作的惯用方式。

 Cache::Cache() : byte()
{
}

请注意,C++11 也允许这种语法:

 Cache::Cache() : byte{}
{
}

如果您想知道 为什么 这样做有效,请参阅 C++ 11 标准(注意这也适用于 C++03):

C++11 § 8.5,p10

初始值设定项为空括号集的对象,即 () ,应进行 值初始化

值初始化 这个术语将我们带到:

C++11 § 8.5,p7

对 T 类型的对象进行值初始化意味着:

  • 如果 T 是具有用户提供的构造函数 (12.1) 的(可能是 cv 限定的)类类型9 ,则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化格式错误);

  • 如果 T 是没有用户提供的构造函数的(可能是 cv 限定的)非联合类类型,则该对象是零初始化的,并且如果 T 的隐式声明的默认构造函数是非平凡的,则调用该构造函数。

  • 如果 T 是一个数组类型,那么每个元素都是值初始化的;

  • 否则,对象被零初始化。

这里的第三个选项触发每个元素的值初始化;第四种适用于我们到达这些元素中的每一个,因为它们 (a) 没有类类型,因此 (1) 和 (2) 消失了,并且 (b) 不是数组,因此 (3) 消失了。只剩下最后一个,并且您的元素是零初始化的。

原文由 juanchopanza 发布,翻译遵循 CC BY-SA 4.0 许可协议

Cache 构造函数中,当你这样做时:

 byte[16]={0};

您只设置数组的第 16 个字节(超出范围,因此此操作具有未定义的行为)。数组对象在 C++ 中默认初始化,因为您存储 int ,不执行初始化。

您可以使用 std::fill 来初始化它:

 Cache::Cache()
{
  std::fill(byte, byte+16, 0);
}

或者,您可以在数组上使用常规 for 循环。

原文由 quantdev 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题