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

C++ const 關鍵字全方位詳解:從文字常量到 const_cast

     編輯:關於C++

1. 文字常量 vs 常變量

特性文字常量常變量 (const)
存儲區代碼區(不可尋址)數據區(可尋址)
值可變性不可變語法層面不可變,運行期可通過指針修改
例子靜態數組名、枚舉值、#define、字符串字面值const int x = 5;

2. 常變量替換規則

初始化的 const 整型變量,編譯器視為編譯期常量,在用處替換為文字常量:

const int m = 5;
int arr[m];  // OK:m 被替換為 5

const int n;  // 未初始化
// int arr2[n];  // 錯誤:n 非常量表達式

3. const 與指針/引用

指針

int const* p1;  // const int* p1:指向常量的指針,*p1 不可改,p1 可改
int* const p2;    // 指針常量,p2 不可改,*p2 可改
int const* const p3; // 兩者皆不可改

記憶口訣:const 修飾右側實體。int const* → 修飾 int;int* const → 修飾 int*。

二級指針

int const** p1;  // 指向「指向常量的指針」的指針
int* const* p2;    // 指向「指針常量」的指針

引用

  • const int& r = 5;:綁定臨時對象,延長生命周期
  • int& const r = x;:無意義,引用本身不可重綁定,編譯器忽略

4. 類中的 const:常對象與常函數

常對象

const ClassName obj; → 所有非靜態成員視為 const,只能調用常函數。

常函數

class A {
    int num;
public:
    void disp() const { cout << num << endl; }  // 承諾不修改成員
    void set(int n) { num = n; }                // 非常函數
};

規則:

  1. 聲明與定義都需加 const
  2. 只有非靜態成員函數可為常函數
  3. const 參與函數簽名 → 可重載:void f(); void f() const;
  4. 非 const 對象優先調用非 const 版本;const 對象只能調用 const 版本
  5. 強制調用 const 版本:(const A&)obj.f() 或 static_cast(obj).f()

5. const 修飾函數參數與返回值

位置作用建議
值參數 void f(const int x)無實質意義,不影響調用端不加
引用參數 void f(const int& x)防止函數內修改實參,接受臨時對象推薦用於大對象輸入參數
指針參數 void f(const int* p)防止通過指針修改目標推薦
返回值 const int f()返回非引用類型無意義(右值不可改)不加
返回引用 const int& f()防止 f() = 10; 修改被引用對象必要時加

6. const_cast 運算符

去除 const/volatile 資格:

const int a = 5;
int& r = const_cast(a);  // OK:去除引用的 const
++r;  // 運行期修改成功(但未定義行為風險)

// 錯誤用法:
// int b = const_cast(a);  // 僅能轉換指針/引用類型
// char* p = const_cast(&a); // 不能改變底層類型

規則

  1. 語法:const_cast(expression),括號不可省
  2. 僅能轉換 const T*→T* 或 const T&→T&
  3. 不能去除對象本身的 const 屬性(如 const int a 本身仍是只讀內存)
  4. 優於 C 風格強轉:意圖明確、轉換能力弱(安全)、易搜索審計

7. 核心誤區澄清

誤區 1:const 變量絕對不可修改。
真相:語法層面保護,運行期可通過指針繞過(未定義行為)。

誤區 2:常引用/指針只能指向常量。
真相:常引用可綁定非常量對象,僅限制「通過該引用/指針修改」。

總結

const 是 C++ 類型系統的核心組件,提供編譯期不可變性承諾。掌握要點:

  1. const 修飾右側實體(指針/引用/類型)
  2. 常對象只能調用常函數;常函數承諾不修改非 mutable 成員
  3. 參數傳遞優先用 const T& 避免拷貝且保護實參
  4. const_cast 僅用於接舊式非 const API,屬最後手段
  5. 現代 C++:默認讓變量、參數、成員函數為 const,需要時再移除
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved