C++ 在c+中初始化结构的成员变量+;

C++ 在c+中初始化结构的成员变量+;,c++,struct,initialization,C++,Struct,Initialization,我有一个包含几个双值的结构: struct A { double a; double b; } < >如果我创建一个新的结构,例如 a < /> >,所有成员(例如,代码> A.A/S>)在C++中自动初始化为零? < P>不。在一般情况下,它们有未指定的值。 如果您不喜欢这种行为,可以提供构造函数: struct A { double a; double b; A(): a(0.0), b(0.0) {} } 8.5。初始值设定项[dcl.init]/11 如果没有为

我有一个包含几个双值的结构:

struct A {
  double a;
  double b;
}

< >如果我创建一个新的结构,例如<代码> a < /> >,所有成员(例如,代码> A.A/S>)在C++中自动初始化为零?

< P>不。在一般情况下,它们有未指定的值。

如果您不喜欢这种行为,可以提供构造函数:

struct A {
  double a;
  double b;

  A(): a(0.0), b(0.0) {}
}
8.5。初始值设定项[dcl.init]/11

如果没有为对象指定初始值设定项,则该对象默认为已初始化;如果未执行初始化,则 具有自动或动态存储持续时间的对象具有不确定的值。[注:具有静态或动态 线程存储持续时间为零初始化,见3.6.2.-结束注释]

和(为了可读性,顺序颠倒):

8.5。初始值设定项[dcl.init]/6

默认初始化T类型的对象意味着:

-如果T是(可能是cv限定的)类类型(第9条),则调用T的默认构造函数(以及 如果T没有可访问的默认构造函数,则初始化是错误的)

-如果T是数组类型,则每个元素默认初始化

-否则,不执行初始化。[强调]

如果程序调用常量限定类型T的对象的默认初始化,则T应为类类型 使用用户提供的默认构造函数

它们是默认初始化的。对于像
int
double
这样的内置类型,它们的值取决于结构声明的位置(作为经验法则(但同样如此):假设除非初始化,否则它们总是垃圾

在全局范围或/和
静态
存储中,它们都是零(包括当结构是处于全局范围的结构的成员时)

在函数局部范围内,它们充满了垃圾

例如:

#include <iostream>

struct Foo {
    int x;
    int y;
};

Foo foo;

int main () {
    Foo bar;

    std::cout << foo.x << ":" << foo.y << '\n';
    std::cout << bar.x << ":" << bar.y << '\n';
}
在第二次运行时,无需重新编译,这给了我:

0:0
-1075556168:12574708
POD结构可以使用例如
memset
或仅使用

Foo foo = {0}; // C and C++03
Foo foo{0}; // C++11
默认情况下不是这样(除非它是静态存储的变量-即
静态
或全局变量)

有几种方法可以将此类结构初始化为“零”:

或者,如果您有与C++11兼容的编译器:

A a{0.0, 0.0};
A a{}
或者将构造函数添加到
struct
定义中:

struct A {
  double a;
  double b;
  A() : a(0.0), b(0.0) {}
};

检查这个,还有C++11的
aaa{}
,在2011年之前,
aaa=A()我的意思是,你不需要通过
0
s。如果你想初始化值,你只需要
A A{}
。好吧,我想我已经添加了更多不同的方法-我可能错过了一个或两个更模糊的变体…@matstpeterson如果这些是struct的成员怎么办:1)char arr[20];2) 查尔*城市;3) 指向其他结构的指针。A={}有效吗?它会将它们初始化为零吗?@phresnel当你设计一个类(或结构)时,你需要对它进行通用设计。在某些情况下,它可以初始化,但在一般情况下不能初始化。您需要知道,您的代码通常不会生成已初始化的结构,因此,如果您对已初始化的值感兴趣,请采取措施初始化您的值。这就是我对OP的回答。当然,你对类设计是正确的,但是,它们是否有未指定的值取决于位置,所以对于可能的C++情况的子集,它们确实有很好的指定值。
A a{0.0, 0.0};
A a{}
struct A {
  double a;
  double b;
  A() : a(0.0), b(0.0) {}
};