编译器是否为自动和静态对象提供不同的默认构造函数?

Does the compiler provides different default constructor for automatic & static objects?

本文关键字:默认 构造函数 对象 是否 静态 编译器      更新时间:2023-10-16

我知道编译器提供的默认构造函数不会初始化类的数据成员&结构。考虑以下示例:

#include <iostream>
struct Test
{
     int a,b;                      // oops,still uninitialized
};
int main()
{
      Test t;                      // compiler won't initialize a & b
      std::cout<<t.a<<' ' <<t.b;   // a & b has garbage values
}

,但是正如我们知道对象是否静态的那样,类成员将始终自动0初始化。

#include <iostream>
struct Test
{
     int a,b;              // both a & b will be 0 initialized              
};
int main()
{
      static Test t;               // static object
      std::cout<<t.a<<' ' <<t.b;   // a & b will always be 0 by default
}

所以我的问题是:

1)编译器是否为自动&amp提供不同的默认构造函数;静态对象?

2)编译器会为上述2个程序生成不同的代码吗?

具有静态存储持续时间的对象在任何其他类型的初始化之前始终将零定位化(参见[BASIC.START.INIT])。具有自动存储持续时间的对象不是。构造函数与它无关。

当我研究时,类提供默认的构造函数(无论如何)。因此,您正在创建一个静态对象或普通对象都没关系。只有一个区别是,局部变量的值已被零初始化。