static的做用主要有兩種:c++
第一個做用是限定做用域;第二個做用是保持變量內容持久化;函數
c語言中static的用法:spa
一、全局靜態變量:對象
用法:在全局變量前加上關鍵字static,全局變量就定義成一個全局靜態變量。 static int temp;繼承
內存中的位置:靜態存儲區,在整個程序運行期間一直存在。內存
初始化:未經初始化的全局靜態變量會被自動初始化爲0(自動對象的值是任意的,除非他被顯式初始化);作用域
做用域:全局靜態變量在聲明他的文件以外是不可見的,準確地說是從定義之處開始,到文件結尾。class
二、局部靜態變量:變量
在局部變量以前加上關鍵字static,局部變量就成爲一個局部靜態變量。權限
內存中的位置:靜態存儲區
初始化:未經初始化的全局靜態變量會被自動初始化爲0(自動對象的值是任意的,除非他被顯式初始化);
做用域:做用域仍爲局部做用域,當定義它的函數或者語句塊結束的時候,做用域結束。可是當局部靜態變量離開做用域後,並無銷燬,而是仍然駐留在內存當中,只不過咱們不能再對它進行訪問,直到該函數再次被調用,而且值不變;
三、靜態函數:
在函數返回類型前加關鍵字static,函數就定義成靜態函數。函數的定義和生命在默認狀況下都是extern的,但靜態函數只是在聲明他的文件當中可見,不能被其餘文件所用;
c++中static的用法:
一、類的靜態成員:
class A{
private:
static int val;
};
在cpp中必須對他進行初始化,初始化時使用做用域運算符來標明他所屬類,其屬於該類的全部成員共有,只有一個拷貝;
二、類的靜態成員函數:
class A{
private:
static int func(int x);
};
實現的時候也不須要static的修飾,由於static是聲明性關鍵字;類的靜態函數是該類的範疇內的全局函數,不能訪問類的私有成員,只能訪問類的靜態成員,不須要類的實例便可調用;實際上,他就是增長了類的訪問權限的全局函數;
void A::func(int);
靜態成員函數能夠繼承和覆蓋,但沒法是虛函數;
三、只在cpp內有效的全局變量:
在cpp文件的全局範圍內聲明:
static int val = 0;
這個變量的含義是該cpp內有效,可是其餘的cpp文件不能訪問這個變量;若是有兩個cpp文件聲明瞭同名的全局靜態變量,那麼他們其實是獨立的兩個變量;
四、只在cpp內有效的全局函數:
函數的實現使用static修飾,那麼這個函數只可在本cpp內使用,不會同其餘cpp中的同名函數引發衝突;
warning:不要再頭文件中聲明static的全局函數,不要在cpp內聲明非static的全局函數,若是你要在多個cpp中複用該函數,就把它的聲明提到頭文件裏去,不然cpp內部聲明需加上static修飾;