static的基本用法:
static的作用主要有兩種第一個作用是限定作用域;第二個作用是保持變量内容持久化;
一、c語言中static的用法:
1、全局靜态變量:
用法:在全局變量前加上關鍵字static,全局變量就定義成一個全局靜态變量。 static int temp;
記憶體中的位置:靜态存儲區
生命周期:在整個程式運作期間一直存在。
初始化:未經初始化的全局靜态變量會被自動初始化為0(自動對象的值是任意的,除非他被顯式初始化);
作用域:全局靜态變量在聲明他的檔案之外是不可見的,準确地說是從定義之處開始,到檔案結尾。
2、局部靜态變量:
在局部變量之前加上關鍵字static,局部變量就成為一個局部靜态變量。
生命周期:在整個程式運作期間一直存在
作用域:作用域仍為局部作用域,當定義它的函數或者語句塊結束的時候,作用域結束。但是當局部靜态變量離開作用域後,并沒有銷毀,而是仍然駐留在記憶體當中,隻不過我們不能再對它進行通路,直到該函數再次被調用,并且值不變;
3、靜态函數:
在函數傳回類型前加關鍵字static,函數就定義成靜态函數。函數的定義和生命在預設情況下都是extern的,但靜态函數隻是在聲明他的檔案當中可見,不能被其他檔案所用;
二、c++中static的用法:
1、類的靜态成員:
class A{
private:
static int val;
};
在cpp中必須對他進行初始化,初始化時使用作用域運算符來标明他所屬類,其屬于該類的所有成員共有,隻有一個拷貝;
2、類的靜态成員函數:
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修飾;
探讨問題:
1.全局靜态變量和全局變量有何差別?
答:全局變量(外部變量)的說明之前再冠以static 就構成了靜态的全局變量。全局變量本身就是靜态存儲方式, 靜态全局變量當然也是靜态存儲方式。這兩者在存儲方式上并無不同。這兩者的差別雖在于非靜态全局變量的作用域是整個源程式, 當一個源程式由多個源檔案組成時,非靜态的全局變量在各個源檔案中都是有效的。 而靜态全局變量則限制了其作用域, 即隻在定義該變量的源檔案内有效, 在同一源程式的其它源檔案中不能使用它。由于靜态全局變量的作用域局限于一個源檔案内,隻能為該源檔案内的函數公用, 是以可以避免在其它源檔案中引起錯誤。
常見的問題排查與解決(更新中):
1.VS2017環境,報無法解析的外部符号:

類内相關聲明如下:
這種問題多半是因為static成員沒有進行初始化,在cpp檔案内對成員進行初始化即可。
初始化的格式:typename classname::membername=XXXXX