90

如果我只需要初始化 C++ 结构的几个选择值,这是否正确:

struct foo {
    foo() : a(true), b(true) {}
    bool a;
    bool b;
    bool c;
 } bar;

我是否正确地假设我最终会得到一个struct名为barwith elementsbar.a = truebar.b = true一个 undefined 的项目bar.c

4

4 回答 4

275

您甚至不需要定义构造函数

struct foo {
    bool a = true;
    bool b = true;
    bool c;
 } bar;

澄清一下:这些被称为大括号或相等初始化器(因为您也可以使用大括号初始化而不是等号)。这不仅适用于聚合:您可以在普通类定义中使用它。这是在 C++11 中添加的。

于 2013-05-28T03:39:15.950 回答
45

是的。bar.abar.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.aand所做的那样初始化它bar.b

于 2013-05-28T00:17:12.043 回答
10

您可以使用构造函数来做到这一点,如下所示:

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)。

于 2013-05-28T00:19:38.880 回答
3

显式默认初始化可以帮助:

struct foo {
    bool a {};
    bool b {};
    bool c {};
 } bar;

行为与 returnbool a {}相同。bool b = bool();false

于 2018-10-04T09:39:42.963 回答