static(靜態)變量的作用

1.在函數體中靜態變量有記憶功能,在這一函數被調用過程中其值維持不變。

2.在模塊內,它的作用域範圍是有限制的,如果一個變量被申明爲靜態的,那麼該變量可以被模塊內所有函數訪問,但不能被模塊內其他函數訪問。

3.內部函數應該在當前源文件中說明和定義,對於可以在當前源文件以外使用的函數,應該在一個頭文件中說明,使用這些函數的源文件應該包含該頭文件

4.C++中,在類內的數據成員的聲明前加上關鍵字 static,該成員就是類的靜態數據成員。

靜態數據成員有以下特點:

1)對於非靜態數據成員們,每個類對象都有自己的複製品。而靜態數據成員被當做是類的成員。無論這個類的對象被定義多少個,

靜態數據成員在程序中也只有一份複製品,由該類型的所有對象共享訪問。

(2)靜態數據成員存儲在全局數據區。定義時要分配空間,所以不能在類申明中定義。由於靜態數據成員屬於本類的所有對象共享,所以它不屬於特定的類對象,

在沒有產生類對象時其作用域就可見。

(3)靜態數據成員和普通數據成員一樣遵從 public, protect, private訪問規則。

(4) static 成員變量的初始化是在類外,此時有 protectprivate修飾的static變量雖然可以子啊類外初始化,但是不能在類外被訪問。

與全局變量相比,使用靜態數據成員有以下兩個優勢:

(1) 靜態數據成員沒有靜茹程序的全局名字空間,因此不存在與程序中其他全局名字衝突。

(2) 可以實現隱藏。靜態數據成員可以是 private,而全局不能

靜態成員函數:

在類的成員函數前面添加static關鍵字後就變爲了類對的靜態成員函數,靜態成員函數爲類的全部服務而不是某一個類的具體對象服務。

靜態成員函數是類的內部實現,屬於類定義的一部分。

普通的成員函數一般都隱含了一個this指針,this指針指向類的對象本身,因爲普通成員函數總是具體的屬於某個類的具體對象的。通常情況下,this

是默認的。如函數 fn()實際上是 this->fn();.但是與普通函數相比,靜態成員函數由於不是與任何對象相聯繫,因此它不具有this指針

。從這個意義上講,它無法訪問屬於類對象的非靜態數據成員,也無法訪問非靜態成員函數,它只能調用其餘的靜態成員函數。

引申1:爲什麼static變量只初始化一次?

對於所有對象(不僅僅是靜態對象),初始化都只有一次,而由於靜態變量具有記憶功能,初始化後一直沒有被銷燬,都會保存在內存區域中,

所以不會再次初始化。

存放在靜態區的變量的生命週期一般比較長,一般與整個源程序同生死.共存亡, 所以它只需初始化一次

而 auto 變量,即自動變量,由於存放在棧區,一旦調用過程結束,就會立刻被銷燬。

例:

void fun(int i) {

    printf("i = %d\n", i);

    static int value = i++;

    printf("i = %d\n", i);

    printf("value = %d\n", value);

}

int main()

{

    fun(0);

    fun(1);

    fun(2);

    return 0;

}

輸出:

i = 0

i = 1

value = 0

i = 1

i = 1

value = 0

i = 2

i = 2

value = 0

因爲value是靜態類型(static)只會定義一次,也就是說,不管fun()這個函數被調用多少次,static int value = i++

這條語句只會在第一次被調用時會執行。

引申2:在頭文件中定義靜態變量是否可行爲什麼?

不可行,如果在頭文件中定義靜態變量,會造成資源浪費的問題,同時也可能引起程序錯誤。因爲如果使用了該頭文件的每個C語言文件

中定義的靜態變量,按照編譯的步驟,在每個頭文件中都會單獨存在一個靜態變量,從而會引起空間浪費或程序錯誤。

所以不推薦在頭文件中定義任何變量,當然也包括靜態變量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章