繁体   English   中英

什么时候以及如何在C ++中初始化静态数据?

[英]When and how are static data initialized in C++?

何时初始化静态数据?

我认为:

可以由构造函数初始化,

要么

当它被宣布时,

或在课堂外

class A::member_d = 5; //  member_d is static  

其他 ?

另外,什么时候初始化文件作用域静态变量,什么时候初始化函数作用域静态变量?

我认为它们在声明时已初始化。

谢谢

类的静态成员在定义时进行初始化。 常量整数数据类型是一个异常,可以在声明时进行初始化。 当要执行此类初始化时,会有些复杂(google为静态初始化fiasco )。 根据标准:

如果将初始化推迟到main的第一条语句之后的某个时间点,则它应发生在与要初始化的变量在同一转换单元中定义的任何函数或变量的首次使用之前。

静态存储持续时间对象初始化:

注意:静态成员对象的初始化方式与文件范围内的对象相同。

  • 文件范围内的对象在定义点被初始化。
    • 您可以将它们视为所有在调用main()之前初始化的对象。
    • 详情见下文。
  • 函数范围内的对象在第一次执行通过定义时被初始化。
    • 即通常是第一次调用该函数。

该对象由定义中的初始化程序初始化。 如果您不提供初始化程序,那么它将被零初始化。

int x1;        // zero initialized.
int x2 = 5;    // initialized with 5 
A   y1;        // Default initialized:
               // If A has a user defined constructor this is called.
               // If A has a compiler generated constructor then
               // it is value-initialized which means class objects have their
               // default constructor called and POD objects are zero-initialized
A   y2 = A();  // Default constructed.
A   y3(5);     // Constructor called with value 5.

静态成员与对象和文件作用域完全相同。

class Z
{
    static int x1; // declaration;
    static int x2;
    static A   y1;
    static A   y2;
    static A   y3;
};
// definition

int Z::x1;
int Z::x2 = 5;
A   Z::y1;
A   Z::y2 = A();
A   Z::y3(5);

现在,很难初始化它们的顺序。 该命令故意含糊不清,以允许委员会无法预见的编译器和链接器情况。

它的定义是:

3.6.2非局部变量的初始化

要注意的主要事情是:

具有静态存储持续时间的非局部变量将由于程序启动而初始化。

因此,在大多数情况下,它们都将在输入main之前全部构建完毕。

正如其他人所指出的。 允许编译器延迟初始化。

3.6.2第4段

实现定义是否在第一个main语句之前完成具有静态存储持续时间的非局部变量的动态初始化。

进行此添加主要是为了支持在运行时动态加载库(可以在main启动后动态加载库)。 但这确实提供了一个简单的保证,即在使用该编译中的任何对象或函数之前,编译中的所有静态存储持续时间对象将被完全构造。

3.6.2第5段

如果将初始化推迟到线程的初始函数的第一条语句之后的某个时间点,则初始化应发生在任何线程的首次odd使用(3.2)之前,该变量的线程存储持续时间与该变量在同一转换单元中定义进行初始化。

全局变量在程序启动时初始化,然后调用main() 范围本地的静态对象在第一次执行通过它们时被初始化。

静态类成员只是全局变量,因此请参见上文。

main()返回后,将破坏全局对象和静态对象。

(此方法的实现细节相当复杂,因为所有析构函数都必须排队等待在某个地方执行,并且对于局部静态变量,需要有一个标志来指示对象是否已被实例化。)

不,当然,构造函数无法初始化静态数据成员。 对于const整型或枚举类型,可以在类定义的范围内进行初始化。 但是,通常,您必须在类定义之外进行初始化。

暂无
暂无

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

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