2 回答

TA貢獻1852條經驗 獲得超1個贊
使用CONST說明的成員函數,稱為常成員函數。只有常成員函數才有權使用常量或常對象,沒有使用的CONST說明的成員不能使用常對象。
const成員函數和const對象
實際上,const成員函數還有另外一項作用,即常量對象相關。對于內置的數據類型,我們可以定義它們的常量,用戶自定義的類也一樣,可以定義它們的常量對象。例如,定義一個整型常量的方法為:
const int i=1 ;
同樣,也可以定義常量對象,假定有一個類classA,定義該類的常量對象的方法為:
const classA a(2);
這里,a是類classA的一個const對象,"2"傳給它的構造函數參數。const對象的數據成員在對象壽命期內不能改變。但是,如何保證該類的數據成員不被改變呢?
為了確保const對象的數據成員不會被改變,在C++中,const對象只能調用const成員函數。如果一個成員函數實際上沒有對數據成員作任何形式的修改,但是它沒有被const關鍵字限定的,也不能被常量對象調用。
調用規則
對象 成員函數 對/錯
5、 const const 對
6、 const non-const 錯
7、 non-const const 對
8、 non-const non-const 對

TA貢獻1788條經驗 獲得超4個贊
首先,是加const不是constant。
函數后面加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函數并標記出來是個好習慣,既保證自己不會對類誤操作,也可以明示別人調用你的類里哪些會改變類狀態。
- 2 回答
- 0 關注
- 138 瀏覽
添加回答
舉報