为什么原始类型没有默认初始化,但是对象使用C ++?例如:
class Foo {
void Method() {
int w(); // initialized to 0
int x; // uninitialized
std::vector<int> y(); // initialized to empty vector
std::vector<int> z; // initialized to empty vector
}
}
在这种情况下,w
和y
用括号声明,因此被初始化,z
被声明为没有,并没有调用其默认参数构造函数,但是{{ 1}}仍未初始化。为什么会这样?
答案 0 :(得分:2)
如果没有对象的初始化程序,则该对象为默认初始化 [dcl.init]/12。如果初始化程序是()
,则对象是值初始化的 [dcl.init]/11。类类型的对象(例如std::vector<int>
)的默认初始化调用默认的构造函数,而类型为int
的对象的默认初始化意味着没有初始化[dcl.init]/7。值初始化还会为具有1的类类型的对象调用默认构造函数(例如std::vector<int>
),但是对于类型为int
的对象,值初始化表示零初始化 { {3}}。 int
的零初始化实际上确实意味着int
被初始化为零[dcl.init]/8…
评论中已经指出
int w();
和
std::vector<int> y();
实际上不是局部变量的定义,而是两个函数w
和y
的声明,它们不带参数并分别返回int
和std::vector<int>
(臭名昭著的[dcl.init]/6)。不过,在某些情况下,可以将()
用作实际的初始化程序,因此让我们对示例进行一些修改以演示您所询问的行为:
class Foo
{
int w;
std::vector<int> y;
Foo()
: w(), // value initialized == zero initialized for int
y() // value initialized == default initialized for std::vector<int>
{
int x; // default initialized == uninitialized for int
std::vector<int> z; // default initialized
}
};
答案 1 :(得分:1)
这里的“为什么”简化为“因为C ++试图使C尽可能保持性能和行为兼容”。当您销售一种新的,相对较低级别的语言(至少在最初时)主要是C的超集时,您不想说“如果将现有的C代码编译为C ++,它总是会变慢!” C默认情况下不会对基元进行零初始化;只要代码最终在为其读取之前为其分配值,就可以了,C ++遵循相同的模式。