條款3:儘可能使用const
(1)非常量物件呼叫非常量成員函式 (正確)
(2)非常量物件呼叫常量成員函式 (正確)
(3)常量物件呼叫常量成員函式 (正確)
(4)常量物件呼叫非常量成員函式 (錯誤)
關於成員函式和常量成員函式的使用方法如下:
(1)非常量成員函式呼叫常量成員,不能修改常量 (正確)
(2)非常量成員函式呼叫常量成員函式 (正確)
(3)常量成員函式呼叫非常量成員函式 (錯誤)
(4)常量成員函式呼叫常量成員變數 (正確)
(5)常量成員函式呼叫非常量成員變數,不能進行賦值操作(正確)
②實現函式過載
在Complex類中加入一個const Complex operator + (const Complex &rhs) const函式
測試<1> const Complex operator + (const Complex &rhs) const { return Complex(this->m_x + rhs.m_x, this->m_y + rhs.m_y); } <2> const Complex operator + (const Complex &rhs) { return Complex(this->m_x + rhs.m_x, this->m_y + rhs.m_y); }</span>
const Complex CA(2, 3);
Complex CB(4, 5);
Complex C = CA + CB; //call <1>
Complex D = CB + CA; //call <2></span>
③可以使用non-const版本呼叫const版本
下面是書上的例子,表明bit constness(位不變)的觀點,即在const函式中不能進行對成員賦值操作
class CTextBlock { public: std::size_t length() const; private: char* pText; std::size_t textLength; //最近一次計算的文字區塊長度。 bool lengthIsValid; //目前的長度是否有效。 }; std::size_t CTextBlock::length() const { if(!lengthIsValid) { textLength = std::strlen(pText); //錯誤!在const成員函式內不能賦值給textLength和lengthIsValid。 lengthIsValid = true; } return textLength; }
另一方的觀點程式碼就不貼出來了,使用mutable(可變的)關鍵字,mutable釋放掉non-static成員變數的bitwise constness約束。
存在一些情況,const成員函式與non-const成員函式功能一樣,為了避免程式碼重複,可以通過下面方式non-const函式呼叫const函式。
const char& operator[](size_t position) const //operator[] for const 物件
{
..... //do
..... //do
..... //do
return text[position];
}
char& operator[](size_t position) //operator[] for non-const 物件
{
return const_cast<char &> (static_cast<const TextBlock &> (*this)[position]);
}
第二個返回值解析:先將該物件轉換為常量物件,呼叫cosnt operator[]函式,最後去掉常量熟悉記住:
1.將某些東西宣告為const可幫助編譯器偵測出錯誤用法.const可被施加於任何作用域的物件,函式引數,函式返回型別,成員函式本體.
2.編譯器強制實施bitwise constness,但你編寫程式時應該使用"概念上的常量性"(conceptual constness);
3.當const和non-const成員函式有著實質等價的實現時,令non-const版本呼叫const版本可避免程式碼重複