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

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

不是很理解const和非const函數重載,求解釋~

不是很理解const和非const函數重載,求解釋~

ibeautiful 2021-11-25 21:11:56
class a{public:int x(){......}int x() const{......}};這樣的const重載是允許的 但是什么時候會調用 x()什么時候會調用x() const ? 他們又有什么不同呢?
查看完整描述

2 回答

?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

const a a1;
a a2;
a1.x();
a2.x();

a1調用const版本,a2調用非const版本。

后面加const表示在該函數中不能對類的數據成員進行改變,
比如:

class A
{
private:
int aa;
public:
int x()
{
return aa++;
} //這可以
int x() const
{
return aa++;//這錯誤
}
};
當然有特殊情況,就是用mutable關鍵字修飾過的成員變量可以在聲明為const 函數中被改變。
關于mutable:

關鍵字mutable是C++中一個不常用的關鍵字,他只能用于類的非靜態和非常量數據成員
我們知道一個對象的狀態由該對象的非靜態數據成員決定,所以隨著數據成員的改變,
對像的狀態也會隨之發生變化!
如果一個類的成員函數被聲明為const類型,表示該函數不會改變對象的狀態,也就是
該函數不會修改類的非靜態數據成員.但是有些時候需要在該類函數中對類的數據成員
進行賦值.這個時候就需要用到mutable關鍵字了

例如:
class Demo
{
public:
Demo(){}
~Demo(){}
public:
bool getFlag() const
{
m_nAccess++;
return m_bFlag;
}
private:
int m_nAccess;
bool m_bFlag;
};
int main()
{
return 0;
}

編譯上面的代碼會出現 error C2166: l-value specifies const object的錯誤
說明在const類型的函數中改變了類的非靜態數據成員.

這個時候需要使用mutable來修飾一下要在const成員函數中改變的非靜態數據成員
m_nAccess,代碼如下:

class Demo
{
public:
Demo(){}
~Demo(){}
public:
bool getFlag() const
{
m_nAccess++;
return m_bFlag;
}
private:
mutable int m_nAccess;
bool m_bFlag;
};
int main()
{
return 0;
}

這樣再重新編譯的時候就不會出現錯誤了!



查看完整回答
反對 回復 2021-11-29
?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

const函數是常成員函數,他只能由常對象調用,他是常對象唯一的對外接口,所以是常對象的就調用const函數,其他的調用非const函數

查看完整回答
反對 回復 2021-11-29
  • 2 回答
  • 0 關注
  • 281 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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