c++ - 在初始化该类的静态对象之前,是否保证初始化该类的静态成员?

标签 c++ static

我最近在一次代码审查中遇到了这个 C++ 静态初始化顺序相关的查询。

  1. 我在编译单元中有一个带有静态成员变量的类
  2. 我有一个在不同编译单元中使用构造函数的类的静态对象

这里,我想知道静态成员变量是否保证在调用静态对象构造函数之前被初始化?

MyClass.h:

typedef int (*MyFunc)(int);
class MyClass {
MyClass(MyFunc fptr) {
    mFunc = fptr;
}
static MyFunc mFunc;
}

MyClass.cpp:

MyFunc MyClass::mFunc = nullptr;

MyDifferentClass.h:

MyDifferentClass {
public:
    static int MyStaticFunc(int);
}

MyDifferentClass.cpp:

static MyClass myClassObj(MyDifferentClass::MyStaticFunc);

在代码中,在创建myClassObj之前,mFunc会被初始化为nullptr吗?查询的原因是,如果不能保证顺序,那么mFunc可能会再次初始化为nullptr

最佳答案

In the code, would mFunc be initialized to nullptr before myClassObj gets created? The reason for the query is that if the order is not guaranteed, then mFunc may get initialized again to nullptr.

问题的答案是"is"。

抛开线程特定对象的初始化问题,非局部变量的初始化按以下顺序进行。

  1. 所有变量都是零初始化的(未指定顺序)。这称为零初始化
  2. 所有可以使用常量值初始化的变量都被初始化。这称为常量初始化

那些(上面的 1 和 2)称为静态初始化

之后进行动态初始化。

在您的情况下,MyClass::mFunc 使用常量初始化 进行初始化,而 myClassObj 使用动态初始化 进行初始化>。因此,前者保证首先被初始化。

有关此主题的更多信息,请访问 https://timsong-cpp.github.io/cppwp/n3337/basic.start.init .

关于c++ - 在初始化该类的静态对象之前,是否保证初始化该类的静态成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45594299/

相关文章:

java - java 是否提供内置的静态 String.Compare 方法?

c++ - std::declval<void>() 是一个有效的表达式吗?

Python:静态变量装饰器

java - 操作日期的静态方法。多线程问题

c# - 如何在 C# 中初始化静态变量

c++ - Visual Studio 2010 x64 中 map 的运行时错误

c++ - 在连接 (ping) 之前验证 IP 地址(主机)是否存在

c++ - fatal error : qapplication. h:没有那个文件或目录

c++ - 在 QSplitter 中设置最小固定大小 QCustomPlot 条形图

c# - 静态类与具有构造函数性能的类