gpt4 book ai didi

c++ - 可以在不调用 memset 的情况下从构造函数初始化程序列表中将成员结构设为零吗?

转载 作者:IT老高 更新时间:2023-10-28 21:53:12 28 4
gpt4 key购买 nike

假设我有以下结构声明(没有构造函数的简单结构)。

struct Foo
{
int x;
int y;
int z;
char szData[DATA_SIZE];
};

现在假设这个结构是一个 C++ 类的成员,如下所示:

class CFoobar
{
Foo _foo;
public:
CFoobar();
};

如果我声明CFoobar的构造函数如下:

CFoobar::CFoobar()
{
printf("_foo = {%d, %d, %d}\n", _foo.x, _foo.y,_foo.z);
for (int x = 0; x < 100; x++)
printf("%d\n", _foo.szData[x]);
}

如你所料,当 CFoobar 的构造函数运行时,垃圾数据被打印出来显然,简单的修复是 memset 或 ZeroMemory &_foo。这是我一直做的......

但是,我确实注意到如果将 _foo 添加到不带参数的构造函数的初始化列表中,如下所示:

CFoobar::CFoobar()
: _foo()
{

这似乎将 _foo 的成员变量清零。至少 linux 上的 g++ 是这样的。

现在我的问题是:这是标准 C++,还是编译器特有的行为?

如果这是标准行为,有人可以从官方来源引用我的引用吗?对于更复杂的结构和类的隐式零初始化行为有任何“陷阱”吗?

最佳答案

是的,这是根据标准定义的行为。 12.6.2 [class.base.init]/3 : "如果mem-initializerexpression-list被省略,则基类或成员子对象为值初始化。”

但请注意,如果 Foo 不是 POD 类型但仍然没有用户声明的构造函数(例如,它具有 std::string 类型)那么一些非常流行的编译器将无法正确对它进行值初始化

当您使用 () 作为构造函数初始化程序列表中的初始化程序时,我所知道的所有编译器都会正确执行 POD 成员的 值初始化

关于c++ - 可以在不调用 memset 的情况下从构造函数初始化程序列表中将成员结构设为零吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2816752/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com