2012-07-21 32 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