函數後面加const是表明這個函數不會更改class的狀態,即class內各成員變量的值。編譯器如果發現某個const函數裏改變了成員變量的值會報錯。比如下面這個例子。
struct A {
int i;
void set(int v) {i = v;} //不能加const,因為i值改變了。
int value() const {return i;} //正確,i值沒有改變。
int value2() const {return i++;} //錯誤,因為i值改變了。必須將const去掉。
};
如果函數比較復雜時,比如並不直接改變某個值,但是調用了其它函數,編譯器怎麽判斷函數是否const呢。可以看下面的例子。
struct B {
A a; //B裏包含壹個A類成員。
int func1() const {return a.value();} //正確,所調用的a.value()也是壹個const函數。
int func2() const {return a.value2();} //錯誤,a.value2()不是const函數。
};
也就是說,在const函數裏只能調用成員的const函數以保證成員狀態不會改變。
所以,在設計類的函數裏,區別const和非const函數並標記出來是個好習慣,既保證自己不會對類誤操作,也可以明示別人調用妳的類裏哪些會改變類狀態。