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

时间:2009-04-09 16:28:10

标签: c++ initialization standards

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

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

private:
  char   m_buffer[1024];
};

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

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

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

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

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

由于

2 个答案:

答案 0 :(得分:11)

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

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

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

区别在于:

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

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

答案 1 :(得分:1)

  

以前,我以为这是明智的   总是列出每个成员   初始化列表。

这是为了确保所有成员都已初始化。

要解决您的任务,只需从初始化列表中删除m_buffer。

template <typename T>
struct C
{
    C():
        buff(),
        var(),
        object()
    {
    }
    T buff[128];
    T var;
    std::string object;
};

使用T()的T类型是默认构造函数。对于int,chars等,它是0,对于数组,它是{T()}。对于类,它只是它们的默认构造函数。