C++ static靜態變數(無師自通)

2020-07-16 10:04:40
雖然函數在程式中可以被多次呼叫,但是儲存在函數區域性變數中的值並不會持久存在,這是因為區域性變數在函數終止時即被銷毀,然後在函數再次被呼叫時又會被重新建立。下面的程式說明了這種變化:
#include <iostream>
using namespace std;

void showLocal(); //Function prototype

int main()
{
    showLocal();
    showLocal();
    return 0;
}
void showLocal()
{
    int localNum = 5;   // Local variable
    cout << "localNum is " << localNum << endl;
    localNum = 99;
}
程式輸出結果:

localNum is 5
localNum is 5

即使在第  16 行中,showLocal 函數中的最後一個語句將 99 儲存在 localNum 中,但是,當該函數終止時,localNum 變數仍然被銷毀。下一次呼叫該函數時,localNum 重新建立並重新初始化為 5。

然而,有時候需要讓程式“記住”在函數呼叫之間的區域性變數中儲存了什麼值,這可以通過使變數成為靜態變數來實現。當函數返回時,靜態區域性變數不會被銷毀,它們存在於程式的整個一生中,儘管它們的作用域只是在定義它們的函數中。

下面的程式使用了靜態區域性變數來計算呼叫函數的次數:
#include <iostream>
using namespace std;

void showStatic();  // Function prototype

int main()
{
    // Call the showStatic function five times
    for (int count = 0; count < 5; count++)
        showStatic();
    return 0;
}
void showStatic()
{
    static int numCalls = 0; // Static local variable
    cout << "This function has been called " << ++numCalls << " times." << endl;
}
程式輸出結果:

This function has been called 1 times.
This function has been called 2 times.
This function has been called 3 times.
This function has been called 4 times.
This function has been called 5 times.

此程式的第 15 行中,定義了靜態變數 numCalls,並且將其初始化為 0。每次呼叫 showStatic 函數時,它將在第 16 行中遞增一次,並且由於它是靜態變數,所以它在呼叫之間會保留其值。

有人可能會認為每次呼叫 showStatic 函數時,numCalls 將被重新初始化為 0,但是不會發生這種情況,因為只有在建立該變數時才會初始化一個變數,而在程式執行期間靜態變數只建立一次。如果沒有初始化 numCalls,那麼它將自動初始化為 0,因為和全域性變數一樣,如果程式設計師沒有初始化數位靜態區域性變數,則它們將自動初始化為 0。