static 是 C++ 最多義的關鍵字,分屬**面向過程語境**(全域/局部變數、函數)與**面向物件語境**(類靜態成員)兩大體系。本文系統梳理七大用法特性與避坑指南。
static int n; // 檔案作用域
extern 存取。
void fn() {
static int n = 10; // 僅首次呼叫初始化
cout << n++ << endl;
}
main() { fn(); fn(); fn(); } // 輸出 10 11 12
static void fn(); // 僅本檔可見
this 指標,僅能操作靜態資料(註:原文稱「只能操作靜態成員」有待商榷,自由函數無成員概念)。
class MyClass {
static int Sum; // 宣告
};
int MyClass::Sum = 0; // 定義並初始化(類外,全域/命名空間作用域)
public/protected/private 存取控制。MyClass::Sum(作用域解析運算子)。型別 類別::成員 = 值。obj.Sum 或 MyClass::Sum。private 實現資訊隱藏。
class MyClass {
static void GetSum(); // 宣告
};
void MyClass::GetSum() { ... } // 定義不加 static
this 指標**。this 開銷,較全域函數微快。obj.Func()、ptr->Func()、Class::Func()(推薦)。static**。| 特性 | 靜態全域變數 | 靜態局部變數 | 靜態資料成員 | 靜態成員函數 |
|---|---|---|---|---|
| 儲存區 | 全域資料區 | 代碼區 | ||
| 生命週期 | 程式全程 | |||
| 作用域 | 檔案 | 函數/區塊 | 類別(存取控制) | 類別(存取控制) |
| 連結性 | 內部 | 無連結 | 外部(受存取控制) | 外部(受存取控制) |
| 初始化 | 自動歸零 | 首次執行到 | 類外定義初始化 | 無需初始化 |
| 共享性 | 檔案內共享 | 函數多次呼叫共享 | 全體實例共享 | 全體實例共享 |
namespace { int n; } 替代(C++ 風格內部連結)。virtual:配合靜態/動態多態正確釋放資源(本文範例驗證)。徹底掌握 static 七重語義,是寫出高質量 C++ 代碼的必修課。