儲存類別 定義變數/函數的作用域(可見性)與生命週期。置於型別聲明之前。
| 關鍵字 | 適用對象 | 作用域 | 生命週期 | 備註 |
|---|---|---|---|---|
auto | 區域變數 | 區塊內 | 區塊執行期間 | C++11 前為預設,C++11 起改為型別推導 |
register | 區域變數 | 區塊內 | 區塊執行期間 | 建議編譯器置於暫存器,不可取址 |
static | 區域/全域/成員 | 見下文 | 程式全期 | 多重語意,核心關鍵字 |
extern | 全域變數/函數 | 全程式 | 程式全期 | 跨檔案共享聲明 |
mutable | 類別非靜態成員 | 類別內 | 物件生命週期 | 允許 const 成員函數修改 |
函數內聲明,僅初始化一次,保持值跨越呼叫:
void func() {
static int count = 0; // 只執行一次
cout << ++count << endl;
}
func(); // 1
func(); // 2
限制連結可見性於本轉譯單元(檔案),防止符號衝突:
// file1.cpp
static int internalVar = 42; // 僅 file1 可見
static void helper() { ... } // 僅 file1 可呼叫
屬於類別而非物件,全體物件共享單一副本:
class Widget {
static int count; // 聲明
static void reset() { count = 0; }
};
int Widget::count = 0; // 定義(全域作用域)
聲明非定義,告知編譯器符號在別處定義:
// main.cpp
int globalVar = 10; // 定義
extern void printVar(); // 聲明
// support.cpp
extern int globalVar; // 聲明(引用 main.cpp 定義)
void printVar() { cout << globalVar; }
編譯連結:g++ main.cpp support.cpp -o prog。
建議編譯器將變數置於 CPU 暫存器,加速存取(如迴圈計數器)。現代編譯器自動最佳化暫存器分配,register 僅為提示,且不可取址 (&var 錯誤)。C++17 棄用,C++20 移除保留字語意。
允許 const 成員函數修改該成員,適用於快取、鎖、統計計數等不影響物件邏輯狀態的內部實作細節:
class DataCache {
mutable std::mutex mtx_;
mutable std::optional cache_;
public:
Result get() const {
std::lock_guard lock(mtx_);
if (!cache_) cache_ = compute();
return *cache_;
}
};
C++11 前:auto int x; 等同 int x;(區域變數預設)。
C++11 起:根據初始化式推導型別,auto x = 42; // int,auto&、const auto* 等組合保留 cv 限定詞。
現代 C++ 幾乎普遍使用 auto 推導,減少冗長型別名稱,配合 decltype 處理複雜表達式型別。
const 正確性與內部可變狀態的張力。