如果我只需要初始化 C++ 结构的几个选择值,这是否正确:
struct foo {
foo() : a(true), b(true) {}
bool a;
bool b;
bool c;
} bar;
我是否正确地假设我最终会得到一个struct
名为bar
with elementsbar.a = true
和bar.b = true
一个 undefined 的项目bar.c
?
如果我只需要初始化 C++ 结构的几个选择值,这是否正确:
struct foo {
foo() : a(true), b(true) {}
bool a;
bool b;
bool c;
} bar;
我是否正确地假设我最终会得到一个struct
名为bar
with elementsbar.a = true
和bar.b = true
一个 undefined 的项目bar.c
?
您甚至不需要定义构造函数
struct foo {
bool a = true;
bool b = true;
bool c;
} bar;
澄清一下:这些被称为大括号或相等初始化器(因为您也可以使用大括号初始化而不是等号)。这不仅适用于聚合:您可以在普通类定义中使用它。这是在 C++11 中添加的。
是的。bar.a
并bar.b
设置为 true,但bar.c
未定义。但是,某些编译器会将其设置为 false。
在此处查看实时示例:struct demo
根据 C++ 标准第 8.5.12 节:
如果不执行初始化,则具有自动或动态存储持续时间的对象具有不确定值
对于原始内置数据类型(bool、char、wchar_t、short、int、long、float、double、long double),如果未显式初始化,则只有全局变量(所有静态存储变量)的默认值为零。
如果您真的不想bar.c
以 undefined 开头,您还应该像对bar.a
and所做的那样初始化它bar.b
。
您可以使用构造函数来做到这一点,如下所示:
struct Date
{
int day;
int month;
int year;
Date()
{
day=0;
month=0;
year=0;
}
};
或像这样:
struct Date
{
int day;
int month;
int year;
Date():day(0),
month(0),
year(0){}
};
在您的情况下 bar.c 未定义,其值取决于编译器(而 a 和 b 设置为 true)。
显式默认初始化可以帮助:
struct foo {
bool a {};
bool b {};
bool c {};
} bar;
行为与 returnbool a {}
相同。bool b = bool();
false