1. 程式人生 > >Effective C++:條款03:儘可能使用const

Effective C++:條款03:儘可能使用const

(一)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成員函式裡面是不允許改變物件的!