天天看點

條款 03 :盡可能使用const

條款 03 :盡可能使用const

Use const whenever possible
  1. const的一件奇妙的事情是,他允許你指定一項語義限制(也就是指定一個不可改動的對象),而編譯器會強制實施這項限制。
  2. const出現在星号左邊,表示被指物是常量,出現在星号右邊表示指針自身是常量,出現在兩邊則表示被指物和指都是常量。
  3. const參數:除非需要改變參數或local對象,否則将其聲明為const.
  4. const 成員函數不可以改變對象内任何non-static成員變量。不涉及修改對象資料的都應該聲明為常量成員 函數。
  5. const 成員函數的目的是為了确認該函數可以作用于const對象身上。const成員函數使得操作const對象成為可能。
class A {
public:
	A(int a){ this->x = a; }
	void setx(int x) const{//常量成員函數不能修改non-static成員
		this->x = x;//this->x可以被修改(必須聲明為mutable,否則不行)	
	}
	int getx() { return x; }
private:
	mutable int x;
};
int main() {
	const A a(10);//a為常量對象,
	a.setx(100);//常量對象可以操作常量成員函數
	cout<<a.getx();	//錯誤,常量對象不可以操作常量成員函數 
}
           
  1. const成員函數承諾絕不改變其對象的邏輯狀态,但是non-const成員函數沒有這般承諾。是以不要用const成員函數調用non-const成員函數,反之則沒有問題。

請記住

1. 将某些東西聲明為const可幫助編譯器偵測出錯誤用法。const對象可以被施加在任何 作用域内的對象,函數參數,函數傳回類型,成員函數本題。

2. 編譯器強制實施bitwise constness,但你編寫的程式應該使用概念上的常量性。

3. 當const和non-const成員函數有着實質等價的實作時,令nono-const版本調用const版本可避免代碼重複。

繼續閱讀