初始化结构中的默认值

Joe*_*son 61 c++

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

struct foo {
    foo() : a(true), b(true) {}
    bool a;
    bool b;
    bool c;
 } bar;
Run Code Online (Sandbox Code Playgroud)

我是正确的假设我最终会与一个struct叫项bar的元素bar.a = true,bar.b = true和一个未定义的bar.c

Eri*_*zen 192

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

struct foo {
    bool a = true;
    bool b = true;
    bool c;
 } bar;
Run Code Online (Sandbox Code Playgroud)

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

  • Downvoters:在向人们讲述合法或不合法之前,请熟悉C++ 11对标准的更新.[它实际上编译得很好.](http://ideone.com/lmYeem)这是C++ 11,C++ 11*是*C++,直到采用新版本. (106认同)
  • @BenVoigt啊,C++ 11.我的错.对于那个很抱歉. (8认同)
  • @jamesdlin:自2011年8月21日起,`c ++`标签意味着C++ 11.如果他们想讨论旧版本,欢迎人们说C++ 98或C++ 03.而在明年的某个时候,裸的`c ++`标签将再次改变为C++ 14. (4认同)
  • 值得注意的是,这会立即使类型非POD(通过`std :: is_pod <T> :: value`验证),因此,从这个意义上说,相当于编写一个非默认构造函数,在初始化列表. (4认同)
  • 实际上,只有当 C++11 中没有默认成员初始值设定项时才允许大括号初始化。C++14 解除了此限制。ideone 使用 C++14,但如果您使用任何 C++11 编译器,代码将会失败。http://en.cppreference.com/w/cpp/language/aggregate_initialization (3认同)
  • @BenVoigt是的,我知道.它完全让我觉得这是C++ 11中添加的功能之一. (2认同)

tao*_*ocp 33

是.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,开始时,你也应该像你这样的初始化bar.abar.b.

  • 它不是"未定义",它是_uninitialized_,意味着它具有_indeterminate值_. (2认同)

Nic*_*ola 7

您可以使用构造函数来执行此操作,如下所示:

struct Date
{
int day;
int month;
int year;

Date()
{
    day=0;
    month=0;
    year=0;
}
};
Run Code Online (Sandbox Code Playgroud)

或者像这样:

struct Date
{
int day;
int month;
int year;

Date():day(0),
       month(0),
       year(0){}
};
Run Code Online (Sandbox Code Playgroud)

在你的情况下,bar.c是未定义的,它的值取决于编译器(而a和b设置为true).

  • 没有理由更喜欢第一种形式.您应该使用初始化列表. (9认同)

Ana*_*ian 5

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

struct foo {
    bool a {};
    bool b {};
    bool c {};
 } bar;
Run Code Online (Sandbox Code Playgroud)

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