在构造函数初始化列表中初始化 POD 类型
Initialization of POD types in constructor initialization lists
我找到很多关于 POD 类型的零初始化和默认初始化的文章和 SO 问题,但我没有找到任何讨论 POD 类型初始化为 class 成员的 class构造函数初始化列表。我确定可能有关于它的 SO 问题或文章,但我没有找到。
所以如果我有 class...
class MyClass
{
public:
MyClass() : anArrayOfInt() {}
private:
int anArrayOfInt[10];
}
...在构建 MyClass
对象后,我可以了解 anInt
的哪些状态?我通过经验测试注意到,在 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()
版本恢复到初始化列表版本之前,我需要确定初始化列表条目“anArrayOfInt()
" 保证将 anArrayOfInt
的字节归零,或者如果这只是 GCC 的行为而我不能指望它在其他编译器上。
如果重要的话,GCC 6.4.0 是我们 运行 单元测试的地方,但我们的目标是用于 RX MCU 的 IAR 嵌入式编译器,它仍在 C++03 领域。
So if I have a class...
MyClass() : anArrayOfInt() {}
...what can I know about the state of anInt after construction of a MyClass object?
您已经对成员进行了值初始化,所以我们知道它包含零。
I need to know for certain that the initialization list entry "anArrayOfInt()" is guaranteed to zero the bytes of anArrayOfInt, or if that's just GCC's behavior and I can't count on it on other compilers.
是的,值初始化保证整数被初始化为零。
我找到很多关于 POD 类型的零初始化和默认初始化的文章和 SO 问题,但我没有找到任何讨论 POD 类型初始化为 class 成员的 class构造函数初始化列表。我确定可能有关于它的 SO 问题或文章,但我没有找到。
所以如果我有 class...
class MyClass
{
public:
MyClass() : anArrayOfInt() {}
private:
int anArrayOfInt[10];
}
...在构建 MyClass
对象后,我可以了解 anInt
的哪些状态?我通过经验测试注意到,在 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()
版本恢复到初始化列表版本之前,我需要确定初始化列表条目“anArrayOfInt()
" 保证将 anArrayOfInt
的字节归零,或者如果这只是 GCC 的行为而我不能指望它在其他编译器上。
如果重要的话,GCC 6.4.0 是我们 运行 单元测试的地方,但我们的目标是用于 RX MCU 的 IAR 嵌入式编译器,它仍在 C++03 领域。
So if I have a class...
MyClass() : anArrayOfInt() {}
...what can I know about the state of anInt after construction of a MyClass object?
您已经对成员进行了值初始化,所以我们知道它包含零。
I need to know for certain that the initialization list entry "anArrayOfInt()" is guaranteed to zero the bytes of anArrayOfInt, or if that's just GCC's behavior and I can't count on it on other compilers.
是的,值初始化保证整数被初始化为零。