2012-07-21 65 views
1

我有以下文件:静态变量的初始化:位置相关?

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

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

回答

2

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

基本上,你在哪里定义它并不重要,因为这个。

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

myclass globalInstance; 
int myclass::variable = 0; 

在上面的例子中,我非常肯定myclass的构造函数将在变量被初始化之前调用。在这种情况下,最好在变量之后定义myclass。

编辑:参见http://www.parashift.com/c++-faq/static-init-order.html

+1

小的修正:它不管所述_can_变量被定义,其中,所述编译器可以重新排序初始化如果变量被移动。然而,我们不能依赖订单,唯一的保证是静态变量将在main() – Vlad 2012-07-21 10:08:13

+0

之前被初始化,myclass :: variable'在构造函数调用'globalInstance'之前仍然是零初始化,因为后者是动态的初始化。 – 2012-07-21 10:09:53

+1

@Vlad:在命名空间范围内,在翻译单元中静态存储持续时间的对象必须按其声明的顺序进行初始化,以便编译器_must_在重新排序声明时重新排序初始化(除非在“as if”规则下,它可以确定订单无关紧要)。 – 2012-07-21 10:14:07