C++ empty-paren成员初始化 - 将内存清零?

jw.*_*jw. 3 c++ standards initialization

我最初写了一些像这样的代码:

class Foo
{
public:
  Foo() : m_buffer()
    {}

private:
  char   m_buffer[1024];
};
Run Code Online (Sandbox Code Playgroud)

比我更聪明的人说使用m_buffer()初始化程序会将内存清零.我的意图是保持记忆不被初始化.我没有时间进一步讨论它,但它激起了我的好奇心.

以前,我曾认为总是在初始化列表中列出每个成员是明智的.

有人可以进一步描述这种行为吗?

1)为什么empty-paren初始化程序会填充内存?

2)它只适用于POD数据类型吗?我听说是这样,但没有标准的方便.

谢谢

Joh*_*itb 11

如果您有一个像这样初始化的成员,它将是value-initialized.对于POD来说也是如此.对于结构体,每个成员都以这种方式进行值初始化,对于数组,它的每个元素都是值初始化的.

标量类型(如指针或整数)的值初始化,您将其初始化为0转换为正确的类型.所以你会得到空指针或虚假或具体的任何类型.

请注意,规则从C++ 98巧妙地改变为C++ 03(我们现在拥有的),这可能会产生惊人的效果.C++ 98没有那个value-initialization.它说默认初始化发生,对于非POD类型总是意味着它的默认构造函数调用.但是value-initialization在C++ 03中,如果没有用户声明的构造函数,则具有特殊意义:然后对每个元素进行值初始化.

这是区别:

struct A { int c; ~A() { } }; // non-POD, but no user declared ctor
struct B { A a; B():a(){ } } b;
Run Code Online (Sandbox Code Playgroud)

现在,在C++ 03中,您将保证b.a.c为零.而在C++ 98中,b.a.c会有一些不确定的值.

  • +1.我在G ++中的GOD初始化是一团糟.:( (4认同)
  • 值初始化让我进入了这个提升站点:http://www.boost.org/doc/libs/1_38_0/libs/utility/value_init.htm#valueinit显然有些编译器错误地进行了值初始化,使事情没有初始化.仍然很高兴知道标准是什么. (2认同)