我最初写了一些像这样的代码:
class Foo
{
public:
Foo() : m_buffer()
{}
private:
char m_buffer[1024];
};
比我聪明的人说使用m_buffer()初始化程序会将内存清零。我的意图是保持记忆不被初始化。我没有时间进一步讨论它,但它引起了我的好奇心。
以前,我曾认为总是在初始化列表中列出每个成员是明智的。
有人可以进一步描述这种行为吗?
1)为什么empty-paren初始化程序会填充内存?
2)它只适用于POD数据类型吗?我听说是这样,但没有标准的方便。
由于
答案 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()}。对于类,它只是它们的默认构造函数。