[英]Storage Duration and Member Initialization of a Struct in C++
#include <iostream>
using namespace std;
struct A {
// Some Other Code
int x;
};
A a1;
int main(){
A a2;
cout << "a1.x = " << a1.x << endl;
cout << "a2.x = " << a2.x << endl;
return 0;
}
C ++ 14标准(ISO / IEC 14882:2014)第8.5节,第12段:
如果未为对象指定初始化程序,则该对象将被默认初始化。 当获得具有自动或动态存储持续时间的对象的存储时,该对象具有不确定的值 ,并且如果未对该对象执行初始化,则该对象将保留不确定的值,直到替换该值为止(5.17)。 [注意:具有静态或线程存储持续时间的对象将初始化为零,请参见3.6.2。 -尾注]
那么a1
是否具有静态存储持续时间,而a2
是否具有自动存储持续时间? Struct A
的定义在全局命名空间以及a1
声明中,而a2
声明在块范围中(在main()
函数内部)。
另外,第3.6.2节说:
第1段:
具有静态存储持续时间的非局部变量将由于程序启动而初始化。
第2段:
在进行任何其他初始化之前,应将具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的变量进行零初始化(8.5)。
此外,在gcc 5.4.0中,我得到一个警告( warning: 'a2.A::x' is used uninitialized in this function [-Wuninitialized]
)和一个随机值,但是在clang 3.8.0中,输出始终为a2.x = 0
(零也可以是不确定的值)。 我还进行了其他更复杂的实验,将嵌套的struct
和默认初始化放在// Some Other Code
。 有时我得到随机值,而其他时候(不是可忽略的数量)我得到零。
结构A
的存储期限是多少? 而对象a1
和a2
的对象呢? 而变量a1.x
和a2.x
呢?
应将a1.x
和a2.x
初始化为零? 还是它们不确定价值?
同样的规则适用于class
和union
吗?
// Some Other Code
的代码有什么区别吗? 例如,如果类T“具有带有默认初始值设定项的非静态成员”(例如在struct A { int b = 1; int x; };
),则默认构造函数将不简单(即无法执行任何操作) 。 非平凡的构造函数还会初始化x
吗? 普通的默认构造函数
有趣的链接:
那么a1是否具有静态存储持续时间,而a2是否具有自动存储持续时间?
Struct
A
的定义在全局命名空间中。
这无关紧要。
...位于全局名称空间以及
a1
声明中
a1
具有静态存储持续时间,并且已初始化为零。
而
a2
声明处于块范围内
a2
是非静态块局部变量。 它具有自动存储期限,并且默认情况下已初始化。 它具有不确定的值。
结构
A
的存储期限是多少?
类型没有存储期限。 对象呢。
...以及对象
a1
和a2
的对象?
往上看。
..和变量
a1.x
和a2.x
的变量?
子对象(包括非静态数据成员)继承其超对象的生存期。
...将
a1.x
和a2.x
初始化为零? 还是它们不确定价值?
a1
初始化为零。 这包括其子对象。 a2
不是。 这包括其子对象。
相同的规则适用于阶级和工会吗?
对于存储类,相同的规则集适用于联合和非联合类的对象以及非类类型的对象。 默认初始化对不同类型的含义有所不同。
//其他代码中的代码有什么区别吗? 例如,如果类T的构造函数“具有带有默认初始值设定项的非静态成员”,则默认构造函数将不容易(即不执行任何操作)。
编译器默认生成的非平凡默认构造函数将初始化没有默认初始化程序的成员。
结构A的存储期限是多少?
这个问题没有意义,存储取决于如何使用A
对象a1和a2的对象呢?
a1
具有静态存储。 有关更多详细信息,请参见此问题。
a2
具有自动存储功能。
而变量a1.x和a2.x呢?
它们的存储方式与其父A
实例相同。
相同的规则适用于阶级和工会吗?
是。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.