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

C++ const 完整應用指南:變數、指標、函式、類別成員與 mutable 突破

     編輯:C++ 入門

const 是 C++ 型別系統的核心關鍵字,提供編譯期常數語意、唯讀保護、優化提示與介面契約。本文系統解析五大應用層面:基本宣告與連結屬性、指標雙重 const 語意、函式參數/回傳值 const 規則、類別成員 const 初始化與成員函式 const 語意、mutable 突破機制,建立完整 const 正確性心智模型。

一、基本宣告與連結屬性


const int r = 100;              // 內部連結,編譯期常數替換,必須初始化
extern const int r = 100;       // 外部連結,分配記憶體,可分離宣告定義
const int arr[] = {1,2,3,4};    // 常數陣列,分配記憶體,非編譯期常數運算式

關鍵:const 全域變數預設內部連結(C 語言為外部),跨檔案需 extern。

二、指標雙重 const 語意

宣告語意指向可變指標可變
const int *p / int const *p指向常數的指標❌✅
int *const p常數指標✅❌
const int *const p指向常數的常數指標❌❌

口訣:* 左側 const 修飾指向值,右側 const 修飾指標本身。

三、型別檢查與 const_cast

  • const T* ← 可接受 T*(增加限制,安全)
  • T* ← 不可接受 const T*(移除限制,危險)

const int r = 100;
int *p = const_cast<int*>(&r);  // C++ 風格強制轉換
// *p = 200; // 未定義行為:修改原本 const 物件

四、函式參數與回傳值 const 規則

使用者型別回傳 const 關鍵差異


class X { public: X(int=0); };
X f1();          // 回傳值可作左值:f1() = X(1); ✅
const X f2();    // 回傳 const 禁止左值:f2() = X(1); ❌ 編譯錯誤

五、類別成員 const 機制

1. const 資料成員

  • 必須在建構函式成員初始化列表初始化
  • 建構函式主體初始化 → 編譯錯誤
  • 語法:X::X(int v) : r(v) {}

2. const 成員函式


class X {
    int r;
    int f() const;  // const 置於參數列表後
};
  • const 物件只能呼叫 const 成員函式
  • 編譯器檢查:const 函式內不可修改非 mutable 成員、不可呼叫非 const 成員函式
  • 建構/解構函式不可為 const

3. mutable 突破 const 限制


class X {
    mutable int cache;  // 可在 const 函式修改
    int compute() const {
        if (!cached) { cache = expensive(); cached = true; }
        return cache;
    }
};

適用場景:快取、鎖、統計計數、延遲初始化等邏輯上不影響物件可觀測狀態的內部資料。

4. const_cast 突破(不推薦)


void X::f() const {
    const_cast<X*>(this)->r++;  // 強制移除 this 的 const
}

僅在無法修改類別定義(如第三方庫)時作為最後手段。

總結

「const 正確性」是 C++ 專業程式碼的標誌:預設所有東西皆為 const,除非需要修改。掌握指標雙重 const、函式參數/回傳 const 語意、類別 const 成員初始化規則、const 成員函式契約、mutable 正當用途,能構建類型安全、自我文檔化、編譯器可優化的高品質程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
宣告語意適用場景
void f(const int x)參數值不可修改傳值參數保護
const int f()回傳 const 值內建型別無意義(回傳副本),使用者型別防左值修改
int f(const char *p)參數指向常數保護輸入緩衝區
const char* f()回傳指向常數指標字串常值、唯讀資料
const char* const f()回傳常數指向常數指標防修改指向與值
void f(const X& x)const 參考參數避免拷貝、接受臨時物件、保護原物件