我最近在代码审查中遇到了这个与C ++静态初始化顺序相关的查询。
在这里,我想知道在调用静态对象构造函数之前是否保证静态成员变量被初始化?
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
。
答案 0 :(得分:6)
在代码中,
mFunc
会在创建nullptr
之前初始化为myClassObj
吗?查询的原因是,如果订单无法保证,则mFunc
可能会再次初始化为nullptr
。
问题的答案是“是”。
抛开线程特定对象的初始化问题,按照以下顺序执行非局部变量的初始化。
那些(上面的1和2)被称为静态初始化。
之后,执行动态初始化。
在您的情况下,使用常量初始化初始化MyClass::mFunc
,而使用动态初始化初始化myClassObj
。因此,前者保证首先被初始化。
有关此主题的更多信息,请访问https://timsong-cpp.github.io/cppwp/n3337/basic.start.init。