static關鍵字的用法:
1)將全局變量修飾為靜態全局變量
存儲在靜態存儲區,整個程序運行期間一直存在
靜態全局變量在聲明它的文件之外是不可見的,只要聲明它的文件可見,而普通的全局變量則是所有文件可見
2)將局部變量修飾為靜態局部變量
存儲在靜態存儲區
作用域仍為局部作用域,但是當局部變量離開作用域之后,並沒有銷毀,而是仍然存儲在內存中,只不過目前暫時不能對它進行訪問,直到該函數再次被調用,並且值不變,只會被初始化一次
#include<stdio.h>
int fun() { static int count = 10; //在第一次進入這個函數的時候,變量a被初始化為10!並接着自減1,以后每次進入該函數,a
return count--; //就不會被再次初始化了,僅進行自減1的操作;在static發明前,要達到同樣的功能,則只能使用全局變量:
} int count = 1; int main(void) { printf("global\t\tlocal static\n"); for(; count <= 10; ++count) printf("%d\t\t%d\n", count, fun()); return 0; } /* 程序運行結果: global local static 1 10 2 9 3 8 4 7 5 6 6 5 7 4 8 3 9 2 10 1 */
3)將普通函數修飾為靜態函數
靜態函數只在聲明它的文件中可見,所以不會同其他cpp中的同名函數引起沖突
4)將類的成員變量修飾為靜態成員變量
靜態成員變量是屬於類的,而不是屬於對象的,靜態成員變量可以實現多個對象之間的數據共享,並且靜態成員變量還不會破壞隱藏的原則,對多個對象來說,靜態成員變量只存儲一處,供所有對象共用
5)將類的成員函數修飾為靜態成員函數
靜態成員函數同樣是屬於類的,而不是屬於對象,需要注意的是在靜態成員函數的實現中不可以直接引用類中的非靜態數據成員,但是可以直接引用靜態成員,如果非要引用非靜態的成員,則可以通過對象來引用
static關鍵字的作用:
1)作用域隱藏
當編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性,static可以用作函數和變量的前綴,對函數來講,static的作用僅限於隱藏
2)保持變量內容的持久
存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化,也是唯一一次初始化
3)默認初始化為0(static變量)
4)靜態成員函數和靜態成員變量是屬於類的,所有對象只有一份拷貝,所以不能將靜態函數設置為虛函數(虛函數是來實現多態的,靜態成員屬於類而非對象,沒有多態的概念)