本猿昨天將const關鍵字的常見使用做了介紹,並且針對小白常見混淆的地方做了解釋。今天要講的部分是const的深入部分,有很多的細節。
const與迭代器
STL迭代器以指針為根據塑模,所以迭代器的作用就像一個T*指針,聲明迭代器為const相當於聲明一個T* const,表示這個迭代器不能指向不同的東西。如果希望迭代器所指的東西不能修改,需要const_iterator。
例子:
<code>std::vectorvec;const std::vector /<code>::iterator iter = vec.begin();*iter = 10; // 正確,修改迭代器所指的對象iter++; // 錯誤,迭代器不能修改std::vector ::const_iterator citer = vec.begin();*citer = 10; //錯誤,citer所指對象不能修改citer++; //正確
Bitwise const和Logical const
- Bitwise const,成員函數只有在不更改對象的任何成員變量時才可以說是const,也就是它不更改對象內的任何一個bit。
- Bitwise const正是c++對常量性的定義,因此const成員函數不能更改對象內任何non-static成員變量。
- 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的[]重載函數。
關於const關鍵字的介紹就到這裡,喜歡的小夥伴,可以繼續關注本猿的後續更新。。。。
閱讀更多 Jason攻城獅 的文章