共用方式為


靜態 (C++)

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

根據預設,物件或所有的區塊外部定義的變數有靜態工期] 以及 [外部連結。 靜態的持續時間表示當程式一啟動就會解除配置,當程式結束時要配置的物件或變數。 外部連結表示變數的名稱是用來宣告變數的檔外部可見的。 相反地,內部連結表示的名稱不是用來宣告變數的檔外看得到。

static關鍵字可在下列情況下。

  • 當您宣告變數或函式在檔案範圍 (全域及/或命名空間範圍)、 static關鍵字指定變數或函式具有內部的連結。 當您宣告變數時,變數有靜態的持續時間並且將編譯器它初始化為 0 除非另有指定另一個值。

  • 當您宣告變數,以在函數中, static關鍵字指定的變數會保留它的狀態,此函式呼叫之間。

  • 當您將資料成員宣告在類別宣告中, static關鍵字指定一份該成員共用全部的執行個體的類別。 靜態資料成員都必須定義在檔案範圍。 您將宣告為整數類資料的資料成員conststatic可以有初始設定式。

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

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

如需詳細資訊,請參閱自動extern,以及 註冊

範例

下列範例會示範如何宣告變數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 + + 儲存裝置類別

靜態儲存類別規範

靜態成員函式

存取控制和靜態成員