char greeting[] = "Hello";
char* p = greeting; // non-const ptr, non-const data
const char* p = greeting; // non-const ptr, const data
char const* p = greeting; // 同上(const 修飾 char)
char* const p = greeting; // const ptr, non-const data
const char* const p = greeting; // const ptr, const data
口訣:const 修飾其右側實體。讀宣告時從右向左讀:char* const p → "p is a const pointer to char"。
std::vector<int> vec;
const std::vector<int>::iterator iter = vec.begin(); // 等同 T* const:迭代器不可變,可修改元素
*iter = 10; // OK
++iter; // Error: iter 是 const
std::vector<int>::const_iterator cIter = vec.begin(); // 等同 const T*:元素不可變,迭代器可變
*cIter = 10; // Error
++cIter; // OK
記住:const iterator≈T* const;const_iterator≈const T*。
void func() const 承諾不修改物件的 non-static 成員變數(mutable 除外)。class TextBlock {
char* text;
int length;
mutable bool lengthIsValid; // 允許在 const 函式中修改
public:
int length() const {
if (!lengthIsValid) {
length = std::strlen(text); // OK: lengthIsValid 是 mutable
lengthIsValid = true;
}
return length;
}
};
可透過 const/非 const 多載同名函式,提供不同行為:
class TextBlock {
public:
const char& operator[](std::size_t pos) const { return text[pos]; } // 唯讀
char& operator[](std::size_t pos) { return text[pos]; } // 可寫
};
避免代碼重複:非 const 版本可轉呼叫 const 版本(需 const_cast):
char& TextBlock::operator[](std::size_t pos) {
return const_cast<char&>(
static_cast<const TextBlock&>(*this)[pos]
);
}
const:參數、回傳值、成員函式、區域變數。const 位置對指標/迭代器的不同含義。mutable 處理「邏輯上 const 但實作上需修改」的成員(如快取、鎖)。const_cast 避免重複代碼。