static關鍵字是C, C++中都存在的關鍵字, 它主要有三種使用方式, 其中前兩種只指在C語言中使用, 第三種在C++中使用。本文只介紹c中的使用
(1)局部靜態變數
(2)外部靜態變數/函數
(3)待用資料成員/成員函數
一、局部靜態變數
在C/C++中, 局部變數按照儲存形式可分為三種auto, static, register
與auto類型(普通)局部變數相比, static局部變數有三點不同
1. 儲存空間分配不同
auto類型分配在棧上, 屬於動態儲存裝置類別, 占動態儲存裝置區空間, 函數調用結束後自動釋放, 而static分配在靜態儲存區, 在程式整個運行期間都不釋放. 兩者之間的範圍相同, 但生存期不同.
2. static局部變數在所處模組在初次運行時進行初始化工作, 且只操作一次
3. 對於局部靜態變數, 如果不賦初值, 編譯期會自動賦初值0或Null 字元, 而auto類型的初值是不確定的. (對於C++中的class對象例外, class的對象執行個體如果不初始化, 則會自動調用預設建構函式, 不管是否是static類型)
特點: static局部變數的”記憶性”與生存期的”全域性”
所謂”記憶性”是指在兩次函數調用時, 在第二次調用進入時, 能保持第一次調用退出時的值.
注意事項:
1. “記憶性”, 程式運行很重要的一點就是可重複性, 而static變數的”記憶性”破壞了這種可重複性, 造成不同時刻至啟動並執行結果可能不同.
2. “生存期”全域性和唯一性. 普通的local變數的儲存空間分配在stack上, 因此每次調用函數時, 分配的空間都可能不一樣, 而static具有全域唯一性的特點, 每次調用時, 都指向同一塊記憶體, 這就造成一個很重要的問題 ---- 不可重新進入性!!!
這樣在多線程程式設計或遞迴程式設計中, 要特別注意這個問題.
二、外部靜態變數/函數
在C中static有了第二種含義:用來表示不能被其它檔案訪問的全域變數和函數。, 但為了限制全域變數/函數的範圍, 函數或變數前加static使得函數成為靜態函數。但此處“static”的含義不是指儲存方式,而是指對函數的範圍僅局限於本檔案(所以又稱內部函 數)。注意此時, 對於外部(全域)變數, 不論是否有static限制, 它的儲存地區都是在靜態儲存區, 生存期都是全域的. 此時的static只是起範圍限制作用, 限定範圍在本模組(檔案)內部.
使用內建函式的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它檔案中的函數同名。
第三種是c++中的應用