1. 程式人生 > >C/C++ static用法小結

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