const
?是 C++ 中用于定義常量或指定不可變性的關鍵字,它在不同上下文中有不同的含義和用法。下面是對?const
?的全面解析:
1. 基本用法
定義常量
const int MAX_SIZE = 100;
const double PI = 3.14159;
這些值在程序運行期間不能被修改
必須在定義時初始化
與指針結合
const int* ptr1; // 指向常量的指針(指針可變,指向的內容不可變)
int* const ptr2; // 常量指針(指針不可變,指向的內容可變)
const int* const ptr3; // 指向常量的常量指針(都不可變)
2. 函數中的 const
函數參數
void print(const std::string& str) {// str 不能被修改std::cout << str;
}
防止函數內部意外修改參數
對于大型對象,const 引用可避免拷貝
函數返回值
const int* getPointer() {static int value = 42;return &value;
}
返回的指針不能用于修改指向的值
3. 類中的 const
const 成員函數
class MyClass {
public:int getValue() const {// 不能修改類的成員變量return value;}
private:int value;
};
承諾不修改對象狀態
可以被 const 對象調用
const 數據成員
class Circle {
public:Circle(double r) : radius(r) {}
private:const double radius; // 必須在構造函數初始化列表中初始化
};
4. constexpr (C++11 引入)
constexpr int square(int x) {return x * x;
}constexpr int val = square(5); // 編譯時計算
表示值或函數可以在編譯時計算
比 const 更嚴格,所有 constexpr 都是 const
5. mutable 關鍵字
class Cache {
public:int getValue() const {if (!valid) {// 即使是在 const 成員函數中,也可以修改 mutable 成員cachedValue = expensiveCalculation();valid = true;}return cachedValue;}
private:mutable int cachedValue;mutable bool valid = false;
};
允許在 const 成員函數中修改特定成員
最佳實踐
默認使用 const 除非需要修改
對于函數參數,優先使用 const 引用傳遞大型對象
對于不修改對象狀態的成員函數聲明為 const
使用 constexpr 替代宏定義常量
const 的正確使用可以提高代碼的安全性和可讀性,是 C++ 編程中的重要概念。