3
#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的 s 和默认初始化放在// Some Other Code. 有时我得到随机值,而其他时候(不是可以忽略的数量)我得到一个零。

  • 结构的存储期限是A多少?而对象a1a2?那变量a1.xa2.x

  • 应该a1.xa2.x初始化吗?还是它们是不确定的值?

  • 相同的规则是否适用于classunion

  • 里面的代码有什么区别// Some Other Code吗?例如,如果一个类 T“具有带有默认初始化程序的非静态成员”(如 in struct A { int b = 1; int x; };),那么默认构造函数就不能是微不足道的(即不能执行任何操作)。那个不平凡的构造函数也会初始化x吗?平凡的默认构造函数

有趣的链接:

C++ 结构初始化

初始化结构中的默认值

C++ 结构的成员是否默认初始化为 0?

C++ 中 POD 类型的默认初始化

在 C 与 C++ 中使用静态存储持续时间初始化对象

C 和 C++:自动结构的部分初始化

如何将结构初始化为所有元素零或空

4

2 回答 2

5

那么 a1 是否具有静态存储持续时间而 a2 是否具有自动存储持续时间?

Struct 的定义A在全局命名空间...

这是无关紧要的。

...在全局命名空间中,以及a1声明

a1具有静态存储持续时间并且它是零初始化的。

a2声明在块范围内

a2是一个非静态块局部变量。它具有自动存储持续时间,并且默认初始化。它具有不确定的价值。


结构的存储期限是A多少?

类型没有存储期限。对象可以。

...而对象a1a2

看上面。

..那变量a1.xa2.x

子对象,包括非静态数据成员,继承其超对象的生命周期。

...应该a1.x并被a2.x零初始化?还是它们是不确定的值?

a1是零初始化的。这包括它的子对象。a2不是。这包括它的子对象。

相同的规则是否适用于阶级和工会?

当涉及到存储类时,相同的规则集适用于联合和非联合类的对象以及非类类型。对于不同类型,默认初始化的含义有所不同。

// 其他代码中的代码有什么不同吗?例如,如果类 T 的构造函数“具有带有默认初始值设定项的非静态成员”,则默认构造函数不能是微不足道的(即不执行任何操作)。

由编译器默认生成的非平凡默认构造函数初始化没有默认初始值设定项的成员。

于 2017-01-11T16:41:48.887 回答
2

结构 A 的存储期限是多久?

这个问题没有意义,存储取决于如何A使用。


对象 a1 和 a2 呢?

a1有静态存储。有关更多详细信息,请参阅此问题。

a2有自动存储。


那么变量 a1.x 和 a2.x 呢?

它们的存储方式与其父A实例相同。


相同的规则是否适用于阶级和工会?

是的。

于 2017-01-11T16:41:28.250 回答