C++ static variable(靜態變數) 學習

JUAN425發表於2014-08-14

在C++語言中, 我們可以在函式中(in function)使用static variable, 也可在class中將static variable 作為一個class的member(成員變數)。

當然我們亦可以用static去修飾函式, 類的成員函式(靜態成員函式, 此時用於處理類的靜態成員變數)等等。

首先看一個例子:

當我們才一個函式中宣告一個static的變數的時候(即static 為function scope), 那麼這個靜態變數的 lifetime  將開始於函式第一次呼叫開始, 一直到這個Program 執行結束.

即函式中的宣告並初始化的static變數只執行一次, 無論在Program呼叫多少次, 都只執行一次, 並該變數儲存在heap中。 發生修改就可以儲存。

#include <iostream>

using namespace std;

void display();

int main()
{
    display();
    display();
    display();
    display();
    display();
     return 0;
}


void display() {
    static int counter = 0;
    cout << "display function called " << ++counter << " times." << endl;
}



執行結果如下:




課件,宣告在函式內部的static 變數並不隨著函式的呼叫的結束而釋放掉。 static變數在程式中的位置是heap中。

而非在stack frame中。(這有點像函式中的動態分配(new)的變數, 不會隨著函式呼叫的結束而結束, 除非我們在函式內部delete了) .

(可以在code::blocks 除錯檢視靜態變數的變化。)



要想結束除錯, 直接點選下圖紅色叉即可: 



NOTE: code::blocks 的一個快捷方式:

CTRL + D 表示複製當前行(或者選中的block), 貼上帶在緊接著的下面的位置。 舉一個簡單的例子:



如上圖選中, 按下CTRL + D 出現如下情況:



另外, 快捷鍵 CTRL + G, 為調到哪一行, 輸入先要調到的位置確認(Enter)即可。 很好用。




EX2:

當static為類的成員變數的時候, 必須在類外初始化, 不能再類內初始化。 另外, static variable 不管我們宣告瞭多少個該類物件, 我們只有一個copy的這個static 成員變數。 

#include <iostream>

using namespace std;

class Human {
    public:
    static int human_count;
};

int Human::human_count = 0; // 因為是public, 所以可以這樣寫 

int main() {
    cout << Human::human_count; return 0;
}
執行結果為:




現在對上述程式修改, 用static variable 記錄下用該類宣告的物件的個數。


#include <iostream>

using namespace std;

class Human {
    public:
    static int human_count;

    Human() {
        human_count++;
    }

    void humanTotal() {
        cout << "There are " << human_count << " peoples in the program. " << endl;
    }
};

int Human::human_count = 0;

int main() {
    cout << Human::human_count << endl;

    Human anil;
    anil.humanTotal();

    Human he;
    Human xin;
    xin.humanTotal();
    cout << Human::human_count << endl;
    return 0;
}

執行結果如下:





相關文章