构造函数初始化列表中POD类型的初始化

时间:2019-01-05 23:58:48

标签: c++ c++03

我找到了很多有关POD类型的零初始化和默认初始化的文章和相关问题,但是我没有在类构造函数初始化列表中找到任何讨论POD类型初始化作为类成员的问题。我敢肯定可能有关于它的SO问题或文章,但我还没有找到。

所以如果我有课...

class MyClass
{
public:
   MyClass() : anArrayOfInt() {}
private:
   int anArrayOfInt[10];
}

...在构造anInt对象之后,我对MyClass的状态有什么了解?通过经验测试,我注意到在GCC 6.4.0上使用上述代码,在创建anArrayOfInt的堆栈分配实例之后,MyClass为全零,但是如果我将代码更改为:

class MyClass
{
public:
   MyClass() {}
private:
   int anArrayOfInt[10];
}

...然后堆栈分配的实例在anArrayOfInt中不再具有全零。在我的实际情况下(促使我写这个问题的情况),这导致测试失败。我注意到如果我按如下所示更改代码:

class MyClass
{
public:
   MyClass() { memset(anArrayOfInt, 0, sizeof(anArrayOfInt)); }
private:
   int anArrayOfInt[10];
}

...然后,即使没有在构造函数初始化列表中列出anArrayOfInt(),我的测试也再次通过。因此,似乎我需要在初始化列表中使用anArrayOfInt(),但是在从memset()版本恢复到初始化列表版本之前,我需要确定一下初始化列表条目“ {{1} }”保证将anArrayOfInt()的字节清零,或者这仅仅是GCC的行为,我不能依靠其他编译器。

如果有关系,我们将在GCC 6.4.0中运行单元测试,但我们的目标是仍然是C ++ 03版本的用于RX MCU的IAR嵌入式编译器。

1 个答案:

答案 0 :(得分:1)

  

所以如果我有课...

MyClass() : anArrayOfInt() {}
     

...在构造MyClass对象之后,我可以了解anInt的状态吗?

您已经对成员进行了初始化,所以我们知道它包含零。

  

我肯定需要知道初始化列表项“ anArrayOfInt()”确保将anArrayOfInt的字节清零,或者这仅仅是GCC的行为,我不能指望其他编译器。

是的,值初始化保证整数被初始化为零。