繁体   English   中英

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

[英]Initializing member variables of a struct in c++

我有一个带有几个double值的结构:

struct A {
  double a;
  double b;
}

如果我创建一个新结构,例如A a ,是否所有成员(例如aa )在C ++中自动初始化为零?

不是默认情况下(除非它是静态存储的变量 - 即static或全局变量)。

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

A a = { 0.0, 0.0 };
A a = { };

A a = A();

或者如果你有一个C ++ 11兼容的编译器:

A a{0.0, 0.0};
A a{}

或者在struct定义中添加构造struct

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是数组类型,则每个元素都是默认初始化的;

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

如果程序要求对const限定类型T的对象进行默认初始化,则T应为具有用户提供的默认构造函数的类类型。

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

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

在功能本地范围内,它们充满了垃圾。

例:

#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
-1077978680:12574708

在第二次运行,没有重新编译,这给了我:

0:0
-1075556168:12574708

POD结构可以使用例如memset初始化所有零或只是...

Foo foo = {0}; // C and C++03
Foo foo{0}; // C++11

不是。在一般情况下,它们具有未指定的值。

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

struct A {
  double a;
  double b;

  A(): a(0.0), b(0.0) {}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM