靜態 (C++)
static 關鍵字可用來宣告變數、函式、類別資料成員和類別函式。
根據預設,在所有區塊外部定義的物件或變數會擁有靜態持續期間和外部連結。 靜態持續期間是指,物件或變數會在程式啟動時配置,並在程式結束時解除配置。 外部連結是指,變數名稱在變數宣告所在的檔案外部可見。 相反地,內部連結是指,名稱在變數宣告所在的檔案外部不可見。
static 關鍵字可在下列狀況中使用。
當您在檔案範圍 (全域和/或命名空間範圍) 宣告變數或函式時,static 關鍵字會指定變數或函式擁有內部連結。 當您宣告變數時,變數會擁有靜態持續期間,且編譯器會將其初始化為 0 (除非您指定其他值)。
當您在函式中宣告變數時,static 關鍵字會指定該變數在兩次呼叫該函式之間保留其狀態。
當您在類別宣告中宣告資料成員時,static 關鍵字會指定成員的一個複本供類別的所有執行個體共用。 靜態資料成員必須以檔案範圍定義。 您宣告為 const static 的整數資料成員可以擁有初始設定式。
當您在類別宣告中宣告成員函式時,static 關鍵字會指定該函式供類別的所有執行個體共用。 靜態成員函式無法存取執行個體成員,因為函式沒有隱含的 this 指標。 若要存取執行個體成員,請使用本身為執行個體指標或參考的參數宣告函式。
您無法將等位的成員宣告為靜態。 不過,全域宣告的匿名等位必須明確宣告為 static。
如需詳細資訊,請參閱 auto、extern 和 register。
範例
下列範例將示範在函式中宣告為 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);
}