Effective C++ 儘可能使用const (下)

本猿昨天將const關鍵字的常見使用做了介紹,並且針對小白常見混淆的地方做了解釋。今天要講的部分是const的深入部分,有很多的細節。

Effective C++ 儘可能使用const (下)

const與迭代器

STL迭代器以指針為根據塑模,所以迭代器的作用就像一個T*指針,聲明迭代器為const相當於聲明一個T* const,表示這個迭代器不能指向不同的東西。如果希望迭代器所指的東西不能修改,需要const_iterator。

例子:

<code>std::vector vec;const std::vector::iterator iter = vec.begin();*iter = 10;                   // 正確,修改迭代器所指的對象iter++;                        // 錯誤,迭代器不能修改std::vector::const_iterator citer = vec.begin();*citer = 10;         //錯誤,citer所指對象不能修改citer++;              //正確/<code>

Bitwise const和Logical const

  1. Bitwise const,成員函數只有在不更改對象的任何成員變量時才可以說是const,也就是它不更改對象內的任何一個bit。
  2. Bitwise const正是c++對常量性的定義,因此const成員函數不能更改對象內任何non-static成員變量。
  3. Logical const,一個const函數可以修改它所處理的對象內的某些bits,但只能在客戶偵查不出的情況下。

樣例代碼:

<code>class Text {public:    std::size_t length() const;private:    char* pText;    std::size_t textLength;    bool lengthValid;};std::size_t Text::length() const {    if (!lengthValid) {                 //錯誤,在const函數內給textLength和lengthValid賦值        textLength  = std::strlen(pText);        lengthValid = true;    }    return textLength;}/<code>

在這個例子中雖然textLength、lengthValid的賦值是可以接受的,但是不能通過bitwsie const的編譯器。如果要使textLength、lengthValid可以修改,需要用mutable釋放掉non-static成員變量的bitwise const約束.

<code>如下:...private:    mutable std::size_t textLength;    mutable bool lengthValid;.../<code>

const和non-const成員函數

因為需要為const和non-const對象都提供一個功能相同的函數,但是這兩個函數只有返回類型是否有const修飾,此時為了避免代碼重複帶來的編譯時間、維護、代碼膨脹等問題,可以讓non-const函數調用const函數,如下:

<code>const char& operator[] (std::size_t position) const {    ...    return text[position];}char& operator[] (std::size_t position) {    ...    return const_cast<char>(static_cast<const>(*this)[posistion]);}/<const>/<char>/<code>

首先為了調用const operator[]函數,需要把this指針轉換為const對象,然後再移除const;如果不把this指針轉為const對象,會遞歸調用non-const的[]重載函數。


Effective C++ 儘可能使用const (下)

關於const關鍵字的介紹就到這裡,喜歡的小夥伴,可以繼續關注本猿的後續更新。。。。


分享到:


相關文章: