天天看點

【C++初級】static用法總結、問題探讨及常見錯誤排查

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環境,報無法解析的外部符号:

【C++初級】static用法總結、問題探讨及常見錯誤排查

類内相關聲明如下:

【C++初級】static用法總結、問題探讨及常見錯誤排查

這種問題多半是因為static成員沒有進行初始化,在cpp檔案内對成員進行初始化即可。

初始化的格式:typename classname::membername=XXXXX

繼續閱讀