亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

見到這么一個面試題:

見到這么一個面試題:

C PHP
慕無忌1623718 2023-01-02 18:15:38
class Foo{int fun() constant;}我從來沒見過函數后面還加constant的,這表示什么意思呢?請高手幫我解答,謝謝了一個變量加constant表示變量不可更改,函數加constant是什么意思呢?代碼不可更改?說不通呀??
查看完整描述

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 對

 


查看完整回答
反對 回復 2023-01-06
?
尚方寶劍之說

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函數并標記出來是個好習慣,既保證自己不會對類誤操作,也可以明示別人調用你的類里哪些會改變類狀態。

查看完整回答
反對 回復 2023-01-06
  • 2 回答
  • 0 關注
  • 138 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號