首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 儲存類別完整指南:auto、register、static、extern、mutable 與生命週期管理

     編輯:C++ 入門

C++ 儲存類別完整指南:auto、register、static、extern、mutable

儲存類別 定義變數/函數的作用域(可見性)與生命週期。置於型別聲明之前。

五大儲存類別

關鍵字適用對象作用域生命週期備註
auto區域變數區塊內區塊執行期間C++11 前為預設,C++11 起改為型別推導
register區域變數區塊內區塊執行期間建議編譯器置於暫存器,不可取址
static區域/全域/成員見下文程式全期多重語意,核心關鍵字
extern全域變數/函數全程式程式全期跨檔案共享聲明
mutable類別非靜態成員類別內物件生命週期允許 const 成員函數修改

static:多重語意核心

1. 區域 static 變數

函數內聲明,僅初始化一次,保持值跨越呼叫:

void func() {
    static int count = 0;  // 只執行一次
    cout << ++count << endl;
}
func(); // 1
func(); // 2

2. 全域 static 變數/函數

限制連結可見性於本轉譯單元(檔案),防止符號衝突:


// file1.cpp
static int internalVar = 42;  // 僅 file1 可見
static void helper() { ... }  // 僅 file1 可呼叫

3. 類別 static 成員

屬於類別而非物件,全體物件共享單一副本:

class Widget {
    static int count;  // 聲明
    static void reset() { count = 0; }
};
int Widget::count = 0;  // 定義(全域作用域)

extern:跨檔案共享

聲明非定義,告知編譯器符號在別處定義:


// 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。

register:歷史遺留

建議編譯器將變數置於 CPU 暫存器,加速存取(如迴圈計數器)。現代編譯器自動最佳化暫存器分配,register 僅為提示,且不可取址 (&var 錯誤)。C++17 棄用,C++20 移除保留字語意。

mutable:邏輯常態突破

允許 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_;
    }
};

auto:從儲存類別到型別推導 (C++11)

C++11 前:auto int x; 等同 int x;(區域變數預設)。
C++11 起:根據初始化式推導型別,auto x = 42; // int,auto&、const auto* 等組合保留 cv 限定詞。
現代 C++ 幾乎普遍使用 auto 推導,減少冗長型別名稱,配合 decltype 處理複雜表達式型別。

總結

  • static 是最複雜、最常用的儲存類別,三大語意必須區分。
  • extern 實現跨檔案共享,配合標頭檔聲明、來源檔定義。
  • mutable 解決 const 正確性與內部可變狀態的張力。
  • register 已淘汰,交給編譯器最佳化。
  • auto 現代語意為型別推導,提升可讀性與維護性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved