1. 程式人生 > >條款3:儘可能使用const

條款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版本可避免程式碼重複