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

时间:2017-08-09 15:02:54

标签: c++ static

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

  1. 我在编译单元中使用静态成员变量
  2. 我使用不同编译单元中的构造函数
  3. 构建了该类的静态对象

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

    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);
    

    在代码中,mFunc会在创建nullptr之前初始化为myClassObj吗?查询的原因是,如果订单无法保证,则mFunc可能会再次初始化为nullptr

1 个答案:

答案 0 :(得分:6)

  

在代码中,mFunc会在创建nullptr之前初始化为myClassObj吗?查询的原因是,如果订单无法保证,则mFunc可能会再次初始化为nullptr

问题的答案是“是”。

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

  1. 所有变量均为零初始化(未指定顺序)。这称为零初始化
  2. 初始化可以使用常量值初始化的所有变量。这称为常量初始化
  3. 那些(上面的1和2)被称为静态初始化

    之后,执行动态初始化。

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

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