初始化结构体中的默认值



如果我只需要初始化c++结构体的几个select值,这样是否正确:

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

我是否可以假设我最终会得到一个名为barstruct项目,其中包含元素bar.a = true, bar.b = true和未定义的bar.c ?

甚至不需要定义构造函数

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

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

是。bar.abar.b设置为true,但bar.c未定义。但是,某些编译器会将其设置为false。

查看下面的实例:

根据c++标准章节8.5.12:

如果没有初始化,则返回具有自动或动态存储持续时间的对象具有不确定值

对于基本内置数据类型(bool, char, wchar_t, short, int, long, float, double, long double),只有全局变量(所有静态存储变量)在未显式初始化的情况下获得默认值为零。

如果你不想让bar.c从未定义的开始,你也应该像对bar.abar.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;

行为bool a {}bool b = bool();相同,返回false

最新更新