2012-12-05 54 views
1

我想知道靜態是如何工作的。下面是一個例子:靜態整數

void count() 
{ 
    static int x = 1; 
    cout << "Static: " << x << endl; 
    x++; 

    return; 
} 

int main() 
{ 
    //Static variable test 
    cout << endl; 
    count(); 
    count(); 
} 

該程序給出了「1和2」的輸出。但我想知道什麼時候第二次調用函數「count」,爲什麼不執行「static int x = 1」行?

回答

6

這是一種語言規則;一個static變量的初始化只執行一次。

注意,這是不同於

static int x; 
x = 1; 

這將在每次調用重置x爲1。

1

這就是規則所說的。您可以將static行認爲僅在第一次調用該函數時執行。

1

它是。否則,你根本看不懂x的值。但是,如果它已經創建,則它不會將值設置爲x

2

靜態局部變量有點像全局變量,只是編譯器只讓一個函數訪問它。所有靜態分配的對象(內建或用戶定義的類型),包括結構體/類的靜態成員變量,都在系統調用main()函數之前由系統初始化一次。通過製作一個類的全局(或靜態文件範圍)實例,並在類構造器中做一些有趣的事情,你可以利用這個特性來獲得你的優勢(或者如果你不知道發生了什麼,可以得到一些好奇的行爲)。該代碼將在main()開始之前運行。

但是....你必須小心這樣做。沒有強制這些初始化對象的順序的標準方法,所以如果一個依賴於另一個已經初始化的對象,有一天什麼「正常工作」可能會在更改編譯器或編譯器選項或添加/刪除時開始「工作不正常」源文件等

+0

你可以做什麼樣的有趣事情? – Josh

+1

我們使用該特性將單元測試添加到要運行的全局單元測試數組中。我們使用名爲TESTCASE(test_name)的宏創建一個名爲test_name ## _ XXXX的全局變量(我不記得XXXX是什麼,但是##將_XXXX添加到文本「test name」中,並將它全部作爲一個標識符) 。全局變量是一種類型,它的構造函數只是將一個函數指針添加到全局數組中以便稍後執行。然後宏通過爲測試函數本身創建簽名結束,然後添加大括號並開始測試函數的代碼。 – phonetagger

+0

...這樣你就不必做一個頭文件來聲明你的單元測試函數的存在,然後去一些主要的「測試用例執行器」文件,並將你的新函數添加到不斷增長的測試列表中運行,這將分散在三個文件。通過這種方式,整個單元測試可以隔離到單個文件的幾行內容,並且很容易在源代碼中禁用,而無需單獨的文件將其註釋掉。 – phonetagger