C/C++ static用法小結
static的作用主要有兩種:
第一個作用是限定作用域;第二個作用是保持變數內容持久化;
c語言中static的用法:
1、全域性靜態變數:
用法:在全域性變數前加上關鍵字static,全域性變數就定義成一個全域性靜態變數。 static int temp;
記憶體中的位置:靜態儲存區,在整個程式執行期間一直存在。
初始化:未經初始化的全域性靜態變數會被自動初始化為0(自動物件的值是任意的,除非他被顯式初始化);
作用域:全域性靜態變數在宣告他的檔案之外是不可見的,準確地說是從定義之處開始,到檔案結尾。
2、區域性靜態變數:
在區域性變數之前加上關鍵字static,區域性變數就成為一個區域性靜態變數。
記憶體中的位置:靜態儲存區
初始化:未經初始化的全域性靜態變數會被自動初始化為0(自動物件的值是任意的,除非他被顯式初始化);
作用域:作用域仍為區域性作用域,當定義它的函式或者語句塊結束的時候,作用域結束。但是當局部靜態變數離開作用域後,並沒有銷燬,而是仍然駐留在記憶體當中,只不過我們不能再對它進行訪問,直到該函式再次被呼叫,並且值不變;
3、靜態函式:
在函式返回型別前加關鍵字static,函式就定義成靜態函式。函式的定義和生命在預設情況下都是extern的,但靜態函式只是在宣告他的檔案當中可見,不能被其他檔案所用;
c++中static的用法:
1、類的靜態成員:
class A{
private:
static int val;
};
在cpp中必須對他進行初始化,初始化時使用作用域運算子來標明他所屬類,其屬於該類的所有成員共有,只有一個拷貝;
2、類的靜態成員函式:
class A{
private:
static int func(int x);
};
實現的時候也不需要static的修飾,因為static是宣告性關鍵字;類的靜態函式是該類的範疇內的全域性函式,不能訪問類的私有成員,只能訪問類的靜態成員,不需要類的例項即可呼叫;實際上,他就是增加了類的訪問許可權的全域性函式;
void A::func(int);
靜態成員函式可以繼承和覆蓋,但無法是虛擬函式;
3、只在cpp內有效的全域性變數:
在cpp檔案的全域性範圍內宣告:
static int val = 0;
這個變數的含義是該cpp內有效,但是其他的cpp檔案不能訪問這個變數;如果有兩個cpp檔案聲明瞭同名的全域性靜態變數,那麼他們實際上是獨立的兩個變數;
4、只在cpp內有效的全域性函式:
函式的實現使用static修飾,那麼這個函式只可在本cpp內使用,不會同其他cpp中的同名函式引起衝突;
warning:不要再標頭檔案中宣告static的全域性函式,不要在cpp內宣告非static的全域性函式,如果你要在多個cpp中複用該函式,就把它的宣告提到標頭檔案裡去,否則cpp內部宣告需加上static修飾;