C 語言三大用法(實為兩類)
1. 靜態局部變量
- 存儲於**全局數據區**,生命周期贯穿整個程序。
- **首次**執行到聲明處初始化,之後調用保持值。
- 作用域仍為局部,不可在函數外訪問。
- 未顯式初始化則默認為 0。
int foo() {
static int i = 1; // 僅初始化一次
return ++i;
}
2. 靜態全局變量 / 靜態函數
- 加
static 限制**連接屬性為內部連接**,僅在本編譯單元可見。
- 實現**文件級封裝**,避免符號衝突。
- 不同文件可定義同名靜態全局變量/函數,互不干擾。
// a.c
static int g_val = 10; // 僅 a.c 可見
static void helper() {}
// b.c
// extern int g_val; // 鏈接錯誤:找不到符號
int g_val = 20; // 另一個獨立變量
C++ 額外兩大用法
3. 靜態數據成員
- 屬於**類**而非對象,全類共享**一份**拷貝。
- 存儲於全局數據區,**不佔用對象內存**(
sizeof 不計入)。
- 必須在類外定義並初始化(
int Class::member = 0;)。
- 可通過
Class::member 或對象訪問。
class Rectangle {
int w, h;
static int totalArea; // 聲明
public:
Rectangle(int w_, int h_) : w(w_), h(h_) { totalArea += w * h; }
static int getTotal() { return totalArea; }
};
int Rectangle::totalArea = 0; // 定義
4. 靜態成員函數
- 無
this 指針,**不能訪問非靜態成員**。
- 可通過
Class::func() 或對象調用。
- 主要用於操作靜態數據成員或作為工廠/工具函數。
class Singleton {
static Singleton *instance;
Singleton() {}
public:
static Singleton* getInstance() {
if (!instance) instance = new Singleton;
return instance;
}
};
對比總結表
| 用法 | 作用域 | 生命周期 | 鏈接性 | 典型場景 |
| C 靜態局部 | 塊級 | 程序全期 | 無鏈接 | 函數內狀態保持 |
| C 靜態全局/函數 | 文件級 | 程序全期 | 內部鏈接 | 模塊封裝、避免衝突 |
| C++ 靜態數據成員 | 類級 | 程序全期 | 外部鏈接 | 共享狀態、計數器 |
| C++ 靜態成員函數 | 類級 | 程序全期 | 外部鏈接 | 工廠、工具、單例 |