static int n; // 僅在本文件可見 // 編譯單元內部鏈接,不進入全局符號表 // 好處:避免多文件同名衝突,實現文件級封裝
對比:無 static 的全局變量具有外部鏈接,多文件 extern 可共享,但易衝突。
void fn() {
static int n = 10; // 僅初始化一次,存儲於全局數據區
cout << n++ << endl;
}
int main() { fn(); fn(); fn(); } // 輸出 10 11 12
特點:
static void fn() { /* ... */ } // 僅本文件可見
// 好處:隱藏實現細節,避免符號衝突
class MyClass {
static int sum; // 聲明
public:
MyClass(int a, int b, int c) { sum += a+b+c; }
static void GetSum() { cout << sum; }
};
int MyClass::sum = 0; // 定義並初始化(類外)
關鍵點:
public/protected/private 訪問控制對象.成員 或 類名::成員class MyClass {
static int sum;
public:
static void GetSum() { cout << sum; } // 無 this 指針
};
核心限制:
對象.函數()、指針->函數()、類名::函數()| 調用者 \ 被調用 | 靜態數據 | 靜態函數 | 非靜態數據 | 非靜態函數 |
|---|---|---|---|---|
| 靜態函數 | ✓ | ✓ | ✗ | ✗ |
| 非靜態函數 | ✓ | ✓ | ✓ | ✓ |
static const integral 類內初始化)undefined referencestatic(錯誤,只在聲明處加)static 數據成員static 成員函數static 限制鏈接可見性std::call_once 或 Meyers Singleton