條款 03 :盡可能使用const
Use const whenever possible
- const的一件奇妙的事情是,他允許你指定一項語義限制(也就是指定一個不可改動的對象),而編譯器會強制實施這項限制。
- const出現在星号左邊,表示被指物是常量,出現在星号右邊表示指針自身是常量,出現在兩邊則表示被指物和指都是常量。
- const參數:除非需要改變參數或local對象,否則将其聲明為const.
- const 成員函數不可以改變對象内任何non-static成員變量。不涉及修改對象資料的都應該聲明為常量成員 函數。
- 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(); //錯誤,常量對象不可以操作常量成員函數
}
- const成員函數承諾絕不改變其對象的邏輯狀态,但是non-const成員函數沒有這般承諾。是以不要用const成員函數調用non-const成員函數,反之則沒有問題。
請記住
1. 将某些東西聲明為const可幫助編譯器偵測出錯誤用法。const對象可以被施加在任何 作用域内的對象,函數參數,函數傳回類型,成員函數本題。
2. 編譯器強制實施bitwise constness,但你編寫的程式應該使用概念上的常量性。
3. 當const和non-const成員函數有着實質等價的實作時,令nono-const版本調用const版本可避免代碼重複。