靜態 (C++)
static關鍵字可以用來宣告變數、 函式、 類別資料成員和類別函式。
根據預設,物件或所有的區塊外部定義的變數有靜態工期] 以及 [外部連結。 靜態的持續時間表示當程式一啟動就會解除配置,當程式結束時要配置的物件或變數。 外部連結表示變數的名稱是用來宣告變數的檔外部可見的。 相反地,內部連結表示的名稱不是用來宣告變數的檔外看得到。
static關鍵字可在下列情況下。
當您宣告變數或函式在檔案範圍 (全域及/或命名空間範圍)、 static關鍵字指定變數或函式具有內部的連結。 當您宣告變數時,變數有靜態的持續時間並且將編譯器它初始化為 0 除非另有指定另一個值。
當您宣告變數,以在函數中, static關鍵字指定的變數會保留它的狀態,此函式呼叫之間。
當您將資料成員宣告在類別宣告中, static關鍵字指定一份該成員共用全部的執行個體的類別。 靜態資料成員都必須定義在檔案範圍。 您將宣告為整數類資料的資料成員conststatic可以有初始設定式。
當您宣告的成員函式,在類別宣告中, static關鍵字指定函式類別的所有執行個體共用。 靜態成員函式無法存取執行個體成員,因為函式沒有隱含this指標。 若要存取的執行個體成員,請宣告函式的執行個體的指標或參考的參數。
您不能宣告為靜態等位的成員。 不過,必須明確地宣告全域宣告的匿名等位static。
範例
下列範例會示範如何宣告變數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);
}