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修飾;