Grz*_*nio 3 c++ struct initialization
我有一个带有几个double值的结构:
struct A {
double a;
double b;
}
Run Code Online (Sandbox Code Playgroud)
如果我创建一个新结构,例如A a,所有成员(例如a.a)是否在C++中自动初始化为零?
Mat*_*son 11
不是默认情况下(除非它是静态存储的变量 - 即一个static或全局变量).
有几种方法可以将这种结构初始化为"零":
A a = { 0.0, 0.0 };
A a = { };
A a = A();
Run Code Online (Sandbox Code Playgroud)
或者如果你有一个C++ 11兼容的编译器:
A a{0.0, 0.0};
A a{}
Run Code Online (Sandbox Code Playgroud)
或者在struct定义中添加构造函数:
struct A {
double a;
double b;
A() : a(0.0), b(0.0) {}
};
Run Code Online (Sandbox Code Playgroud)
8.5.初始化器[dcl.init]/11.
如果没有为对象指定初始化程序,则默认初始化该对象; 如果未执行初始化,则具有自动或动态存储持续时间的对象具有不确定的值.[ 注意:具有静态或线程存储持续时间的对象是零初始化的,请参见3.6.2.- 结束说明 ]
和(为了便于阅读而反转):
8.5.初始化器[dcl.init]/6.
要默认初始化类型的对象T表示:
- 如果T是一个(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
- 如果T是数组类型,则每个元素都是默认初始化的;
- 否则,不执行初始化. [强调我的]
如果程序要求对const限定类型T的对象进行默认初始化,则T应为具有用户提供的默认构造函数的类类型.
它们是默认初始化的.对于像int或的内置类型double,它们的值取决于声明结构的位置(根据经验(但同样如此):假设它们总是垃圾,除非初始化).
在全局范围或/和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';
}
Run Code Online (Sandbox Code Playgroud)
这是第一次运行给了我
0:0
-1077978680:12574708
Run Code Online (Sandbox Code Playgroud)
在第二次运行,没有重新编译,这给了我:
0:0
-1075556168:12574708
Run Code Online (Sandbox Code Playgroud)
POD-struct可以使用eg memset或just ... 初始化为全零.
Foo foo = {0}; // C and C++03
Foo foo{0}; // C++11
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1090 次 |
| 最近记录: |