gpt4 book ai didi

c++ - 为什么对象默认初始化,但是原语不在C++中?

转载 作者:行者123 更新时间:2023-12-01 14:43:48 26 4
gpt4 key购买 nike

为什么原语没有默认初始化,但是对象使用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
}
}

在这种情况下, wy用括号声明,然后进行初始化,并且 z声明为不带,并且不调用其默认构造函数,但 x仍未初始化。为什么是这样?

最佳答案

如果对象没有初始化程序,则该对象为默认初始化的[dcl.init]/12。如果初始化器为(),则该对象为值初始化的[dcl.init]/11。类类型对象(例如std::vector<int>)的默认初始化调用默认构造函数,而int类型的对象的默认初始化意味着没有初始化[dcl.init]/7。值初始化还将为具有1的类类型对象调用默认构造函数(如std::vector<int>一样),但是对于int类型的对象,值初始化表示零初始化[dcl.init]/8。而int的零初始化实际上确实意味着int被初始化为零[dcl.init]/6

正如评论中已经指出的那样,

int w();



std::vector<int> y();

实际上不是本地变量的定义,而是两个函数 wy的声明,它们不带参数并分别返回 intstd::vector<int>(臭名昭著的 most vexing parse)。不过,在某些情况下,可以将 ()用作实际的初始化程序,因此让我们对示例进行一些修改以演示您所询问的行为:

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
}
};

关于c++ - 为什么对象默认初始化,但是原语不在C++中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59418936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com