共用方式為


靜態 (C++)

static 關鍵字可用來宣告變數、函式、類別資料成員和類別函式。

根據預設,在所有區塊外部定義的物件或變數會擁有靜態持續期間和外部連結。 靜態持續期間是指,物件或變數會在程式啟動時配置,並在程式結束時解除配置。 外部連結是指,變數名稱在變數宣告所在的檔案外部可見。 相反地,內部連結是指,名稱在變數宣告所在的檔案外部不可見。

static 關鍵字可在下列狀況中使用。

  • 當您在檔案範圍 (全域和/或命名空間範圍) 宣告變數或函式時,static 關鍵字會指定變數或函式擁有內部連結。 當您宣告變數時,變數會擁有靜態持續期間,且編譯器會將其初始化為 0 (除非您指定其他值)。

  • 當您在函式中宣告變數時,static 關鍵字會指定該變數在兩次呼叫該函式之間保留其狀態。

  • 當您在類別宣告中宣告資料成員時,static 關鍵字會指定成員的一個複本供類別的所有執行個體共用。 靜態資料成員必須以檔案範圍定義。 您宣告為 const static 的整數資料成員可以擁有初始設定式。

  • 當您在類別宣告中宣告成員函式時,static 關鍵字會指定該函式供類別的所有執行個體共用。 靜態成員函式無法存取執行個體成員,因為函式沒有隱含的 this 指標。 若要存取執行個體成員,請使用本身為執行個體指標或參考的參數宣告函式。

  • 您無法將等位的成員宣告為靜態。 不過,全域宣告的匿名等位必須明確宣告為 static。

如需詳細資訊,請參閱 autoexternregister

範例

下列範例將示範在函式中宣告為 static 的變數如何在兩次呼叫該函式之間保留其狀態。

// static1.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
void showstat( int curr ) {
   static int nStatic;    // Value of nStatic is retained
                          // between each function call
   nStatic += curr;
   cout << "nStatic is " << nStatic << endl;
}

int main() {
   for ( int i = 0; i < 5; i++ )
      showstat( i );
}
  

下列範例將示範類別中 static 的用法。

// static2.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
class CMyClass {
public:
   static int m_i;
};

int CMyClass::m_i = 0;
CMyClass myObject1;
CMyClass myObject2;

int main() {
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   myObject1.m_i = 1;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   myObject2.m_i = 2;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   CMyClass::m_i = 3;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;
}
  

下列範例將示範在成員函式中宣告為 static 的區域變數。 靜態變數可供整個程式使用,而類型的所有執行個體會共用靜態變數的相同複本。

注意事項注意事項

將值指派給多執行緒應用程式中的靜態區域變數並不是安全執行緒,不建議將其用於程式設計用途。

// static3.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
struct C {
   void Test(int value) {
      static int var = 0;
      if (var == value) 
         cout << "var == value" << endl;
      else
         cout << "var != value" << endl;

      var = value;
   }
}; 

int main() {
   C c1;
   C c2;
   c1.Test(100);
   c2.Test(100);
}
  

請參閱

參考

C++ 關鍵字

C++ 儲存類別

靜態儲存類別規範

靜態成員函式

存取控制和靜態成員