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

Effective C++ 條款 03:多才多藝的 const

     編輯:關於C++

const 指標與指向 const 的指標

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"。

STL 迭代器的特殊規則

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*。

成員函式的 const

  • void func() const 承諾不修改物件的 non-static 成員變數(mutable 除外)。
  • 編譯器強制檢查:const 成員函式內修改 non-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/非 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 多載提升介面易用性,配合 const_cast 避免重複代碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved