C++ 為靜態存儲持續性變量提供了3種鏈接性:外部鏈接性、內部鏈接性和無鏈接性。
這3種鏈接性在整個程序運行期間都存在,與自動變量相比,它們的壽命更長。由于靜態變量的數目在程序運行期間是不變的,因此程序不需要使用特殊的裝置(如堆棧)來管理他們。編譯器將分配固定的內存塊來存儲所有的靜態變量,這些變量在整個程序運行期間一直存在。
如果沒有顯式地初始化靜態變量,編譯器將把它設置為0。默認情況下,靜態數組和結構將每個元素或成員的所有位都設置為0。
三種靜態持續變量的創建:
- 要想創建鏈接性為外部的靜態持續變量,必須在代碼塊外面聲明它;
- 要想創建鏈接性為內部的靜態持續變量,必須在代碼塊外面聲明它,并且使用static限定符;
- 要想創建沒有鏈接性的靜態持續變量,必須在代碼塊內聲明它,并且使用static限定符。
三種靜態持續變量的例子:
……
int NUM_ZDS_GLOBAL = 80; //#1
static int NUM_ZDS_ONEFILE = 50; //#2
int main(){
…
}
void fun1(int n){
static int nCount = 0; //#3
int nNum = 0; //#4
}
void fun2(int q){
…
}
#1、#2、#3 在整個程序運行期間都存在。在 fun1 中聲明的 #3 的作用域為局部,沒有鏈接性,這意味著只能在 fun1 函數中使用它,就像自動變量 #4 一樣。但是,與 #4 不同的是,即使在 fun1 沒有被執行的時候,#3 也保留在內存中。
#1、#2 的作用域為整個文件,即在聲明的位置開始到文件末尾的范圍內都可以被使用。
具體地說,可以在 main、fun1、fun2 中使用它們。由于 #2 的鏈接性為內部,因此只能在包含上述代碼的文件中使用它;由于 #1 的鏈接性為外部,因此可以在程序的其他文件中使用它。
所有的靜態持續變量都具有下面兩個特征:
- 未被初始化的靜態變量的所有位都被設置為0;
- 只能使用常量表達式來初始化靜態變量。
常量表達式可以使用字面值常量、const 常量和 enum 常量以及 sizeof 操作符。