Effective C++:條款03:儘可能使用const
阿新 • • 發佈:2019-01-26
(一)const與指標:
char greeting[] = "HELLO";
char *p = greeting;
const char *p = greeting; //指標所指物不能改變
char* const p = greeting; //指標自身不能改變
const char* const p = greeting; //指標自身跟指標所指物都不能改變
(二) STL迭代器:
vector<int> vec; const vector<int>::iterator iter1 = vec.begin(); *iter1 = 10; ++iter1; //錯誤!!!iter1是const,所以他自身不能改變 vector<int>::const_iterator iter2 = vec.begin(); *iter1 = 10; //錯誤!!!iter2是const_iterator,所以他所指的東西不能改變 ++iter1;
(三)函式返回const
class Rational {...};
const Rational operator*(const Rational& lhs, const Rational& rhs);
如果不返回const,那麼如果程式設計師誤寫錯程式碼:
Rational a, b, c;
if(a * b = c) //<span style="color:#ff0000;">程式設計師其實是想寫:if(a * b == c) </span>
這樣的話編譯器就不會報錯了!!
所以說如果返回const,那麼程式設計師這種由於筆誤而產生的錯誤就會被編譯器發現了!!
(四)
在const成員函式中如果想要改變成員變數,可以在宣告成員變數之前加上:mutable 例如:
class CTextBlock { public: size_t length() const; private: char* pText; mutable size_t textLength; mutable bool lengthIsValid; }; size_t CTextBlock::length() const { if(!lengthIsValid) { textLength = strlen(pText); //如果上面宣告的時候沒有mutable,那麼編譯器會報錯! lengthIsValid = true; //如果上面宣告的時候沒有mutable,那麼編譯器會報錯! } return textLength; }
(五)在 const 和 non-const 成員函式中避免重複:
運用const成員函式實現出其non-const孿生兄弟:
class TextBlock {
public:
...;
const char& operator[](size_t position) const {
...;
...;
...;
return text[position];
}
char& operator[](size_t position) {
return
const_castchar*>(
static_cast<const TextBlock&>(*this)
[position] //*this是TextBlock型別,先轉化為const TextBlock&型別 //然後用它呼叫const成員函式。返回一個const char&
//最後再把const去掉,返回char&。用這種方法來避免程式碼重複!
);
}
};
但是千萬不能令const版本呼叫non-const版本來避免重複! 因為這樣的話,物件有可能被改動。
請記住:
(1)將某些東西宣告為 const 可幫助編譯器偵測出錯誤用法。 const可被施加於任何作用域內的物件、函式引數、函式返回型別、成員函式本體。
(2)編譯器強制實施bitwise constness,但你編寫程式時應該使用“概念上的常量性”。
(3)當const和non-const成員函式有著實質等價的實現時,令non-const版本呼叫const版本可避免程式碼重複。但是反過來不可以!因為那樣的話有可能會改變物件,但是const成員函式裡面是不允許改變物件的!