3

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

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

private:
  char   m_buffer[1024];
};

比我聪明的人说拥有 m_buffer() 初始化程序会将内存清零。我的意图是让内存保持未初始化状态。我没有时间进一步讨论它,但它激起了我的好奇心。

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

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

1)为什么空括号初始化器填充内存?

2) 它仅适用于 POD 数据类型吗?我听说是这样,但手头没有标准。

谢谢

4

2 回答 2

11

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

对指针或整数等标量类型进行值初始化,您将对其进行初始化以0转换为正确的类型。因此,您将获得空指针或 false 或您具体拥有的任何类型。

Note that the rule changed subtly from C++98 to C++03 (what we have right now), which can have surprising effects. C++98 didn't have that value-initialization. It said default initialization happens, which for a non-POD type always meant it's default constructor invokes. But value-initialization in C++03 has special meaning if there is no user-declared constructor: Every element is value-initialized then.

Here is the difference:

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

Now, in C++03, you will be guaranteed that b.a.c is zero. While in C++98, b.a.c will have some indeterminated value.

于 2009-04-09T16:43:08.043 回答
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()}。对于类来说,它只是它们的默认构造函数。

于 2009-04-09T16:34:06.770 回答