static的用法及其作用
在c語言中,static主要定義全域性靜態變數,定義靜態函式
1.定義全域性靜態變數:在普通全域性變數前面加上關鍵字static,該全域性變數變成靜態全域性變數,如果沒有給初始值,預設初始值為0,靜態全域性變數和普通全域性變數的儲存方式都是靜態儲存方式,但也有不同,普通全域性變數的作用域是整個原始檔,當一個原始檔是由各個原檔案組成時,普通全域性變數在各個原始檔都有效,而靜態全域性變數只能是在定義的本原始檔中有效。所以把普通全域性變數改為靜態全域性變數後是改變了它的作用域,限制了它的使用範圍。
2.定義區域性靜態變數:區域性變數的儲存地址是在棧上,會隨著棧幀的回退而消失。而靜態區域性變數儲存方式是在記憶體的.bss或者.data段,不會隨著棧幀的回退而消失;靜態區域性變數始終存在著,也就是說它的生存週期是整個原始檔,但是作用域和區域性變數的作用域是一樣的,即只能在定義該變數的函式中使用,退出函式後,儘管該靜態區域性變數不會消失,但不能使用它。對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變數不賦初值,則其值是不定的。
3.定義靜態函式:在函式的返回型別加上static關鍵字,函式即被定義成靜態函式。(1)靜態函式只能在本原始檔中使用。(2)在檔案作用域中宣告的inline函式預設為static。在C++語言中,新增了2個作用,定義靜態資料成員和定義靜態函式成員。
1.定義靜態資料成員,記憶體分配地址是在函式的全域性資料區分配,靜態資料成員定義時要分配空間,所以不能在類宣告中定義。
2.定義靜態成員函式,靜態成員函式與類相聯絡,不與類的物件相聯絡。靜態成員函式不能訪問非靜態資料成員,因為非靜態資料成員屬於特定的類例項,主要用於對靜態資料成員的操作;靜態成員函式和靜態資料成員都沒有this指標。