C++ 静态变量的初始化:位置相关?

C++ 静态变量的初始化:位置相关?,c++,oop,C++,Oop,我有以下文件: H文件 class myclass { static int variable; // constructor myclass(); } Cpp文件 // initialize this variable int myclass::variable = 0; myclass::myclass() { // I use here the static variable } 我的问题是:静态变量何时初始化?首先还是在构造函数之后 如果我把它放在 int

我有以下文件:

H文件

class myclass
{
   static int variable;

   // constructor
   myclass();
}
Cpp文件

// initialize this variable
int myclass::variable = 0;

myclass::myclass()
{
   // I use here the static variable
}
我的问题是:静态变量何时初始化?首先还是在构造函数之后

如果我把它放在

int myclass::variable = 0;

类构造函数定义后的行?在类的对象被实例化之前,它还会被初始化吗?

在应用程序启动时,类似这样的静态会被初始化,我假设在你实例化“myclass”之前会这样

基本上,你在哪里定义它并不重要

但是,如果您创建了“myclass”的全局副本,那么我相信您会遇到问题。将定义放在变量初始化之前是完全合法的,例如

myclass globalInstance;
int myclass::variable = 0;
在上面的例子中,我非常确定在初始化变量之前会调用myclass的构造函数。在这种情况下,最好在变量之后定义myclass


编辑:请参见

小更正:变量定义在何处可能很重要,如果变量被移动,编译器可能会重新排序初始化。但是,不能依赖顺序,唯一的保证是静态变量将在main()之前初始化
myclass::variable
在构造函数调用
globalInstance
之前仍将初始化为零,因为后者是动态初始化。@Vlad:在转换单元的命名空间范围内具有静态存储持续时间的对象必须按声明顺序初始化,因此编译器必须对如果您对声明进行重新排序,则会进行初始化(除非根据“似乎”规则,它可以确定顺序无关紧要)。@Charles:标准是否保证单个翻译单元内的顺序?(我不知道。)@Vlad:一般来说,是的。也有一些例外,例如非显式专用类模板的静态成员。