初始化结构中的默认值

时间:2013-05-28 00:14:34

标签: c++

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

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

我是否正确地假设我最终会得到一个名为struct的{​​{1}}项,其中包含元素barbar.a = true和未定义的bar.b = true

4 个答案:

答案 0 :(得分:181)

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

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

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

答案 1 :(得分:30)

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

在此处查看实时示例:struct demo

根据C ++标准第8.5.12节:

  

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

对于原始内置数据类型( bool ,char,wchar_t,short,int,long,float,double,long double),只有全局变量(全部)静态存储变量)如果没有显式初始化,则获取默认值为零。

如果你真的不想开始使用未定义的bar.c,你也应该像对bar.abar.b那样初始化它。

答案 2 :(得分:6)

您可以使用构造函数来完成此操作:

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

答案 3 :(得分:1)

显式的默认初始化可以帮助您

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

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