相关疑难解决方法(0)

成员结构是否可以从构造函数初始化列表中归零,而无需调用memset?

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

struct Foo
{
    int x;
    int y;
    int z;
    char szData[DATA_SIZE];
};
Run Code Online (Sandbox Code Playgroud)

现在让我们说这个结构是C++类的成员,如下所示:

class CFoobar
{
     Foo _foo;
public:
     CFoobar();
};
Run Code Online (Sandbox Code Playgroud)

如果我声明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]);
}
Run Code Online (Sandbox Code Playgroud)

正如您所料,当CFoobar的构造函数运行时,垃圾数据被打印出来显然,简单的解决方法是memset或ZeroMemory&_foo.这就是我一直以来所做的......

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

CFoobar::CFoobar()
: _foo()
{
Run Code Online (Sandbox Code Playgroud)

这似乎将_foo的成员变量清零.至少在Linux上使用g ++就是这种情况.

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

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

c++ visual-c++

20
推荐指数
1
解决办法
3600
查看次数

C++:struct/class中的构造函数与初始化列表

可以使用初始化列表创建结构/类的对象(没有构造函数).为什么在构造函数的 struct/class上不允许这样做?

struct r { int a; };
struct s { int a; s() : a(0) {} };
r = { 1 }; // works
s = { 1 }; // does not work
Run Code Online (Sandbox Code Playgroud)

c++ constructor struct class initializer-list

9
推荐指数
1
解决办法
3725
查看次数

标签 统计

c++ ×2

class ×1

constructor ×1

initializer-list ×1

struct ×1

visual-c++ ×1