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

C/C++ const 關鍵字四大用法完全指南

     編輯:關於C語言

const 核心哲學:讀時從右向左

掌握「右左法則」:從變量名出發,向右找修飾,向左找類型。
例:const int * const p → p 是 const 指針 → 指向 const int。

四大使用場景

1. 定義常量


const int MAX_SIZE = 100;           // 編譯期常量,替代 #define
const double PI = 3.1415926;
const char *const GREETING = "Hello"; // 指針與內容皆不可變

優於宏:有類型、有作用域、可調試、可取地址。

2. 指針與 const(三種組合)

聲明口訣指針可變?內容可變?典型用途
const int *p
int const *p
指向常量的指針是否函數參數 const char *str
int *const p常量指針否(須初始化)是固定緩衝區指針
const int *const p指向常量的常量指針否否只讀配置表指針

3. 函數參數與返回值


// 輸入參數:防止誤修改,接受字面量/const/非 const 實參
void print(const char *str);          // 內容不可改
void process(const BigStruct &obj);   // 引用傳參避免拷貝,且只讀

// 返回值:防止調用者修改內部數據
const char *getConfig() { return config; }

// 成員函數:承諾不修改對象狀態
class Date {
    int year, month, day;
public:
    int getYear() const { return year; } // const 成員函數
    // void setYear(int y) const { year = y; } // 編譯錯誤!
};

4. 類中的 const 成員


class Circle {
    const double radius; // 常量成員:僅能在初始化列表賦值
    mutable int cacheArea; // 可變成員:即使 const 對象也可修改
public:
    Circle(double r) : radius(r), cacheArea(0) {}
    double area() const {
        if (!cacheArea) cacheArea = 3.14 * radius * radius; // 修改 mutable
        return cacheArea;
    }
};

進階:const 與指針/引用的轉換規則

  • T* → const T*:隱式允許(增加限制)
  • const T* → T*:需 const_cast(危險,違反承諾)
  • T& → const T&:隱式允許
  • const T& → T&:需 const_cast
  • 多級指針:int** → const int** 禁止(可間接修改 const),需轉為 const int* const*

工程最佳實踐

  1. 默認加 const:除非需要修改,所有參數、返回值、成員函數、局部變量盡量 const
  2. const 正確性傳播:const 會傳染,調用鏈上下游需一致
  3. 避免 const_cast:除非對接無 const 設計的舊代碼
  4. 區分邏輯常態 vs 物理常態:mutable 用於緩存、鎖、引用計數等不影響可觀測狀態的內部機制

總結

const 是 C/C++類型系統的基石,也是接口契約的核心。熟練掌握四大用法、轉換規則、mutable 機制,能讓編譯器幫你攔截大量邏輯錯誤,寫出更安全、可維護的代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved