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;
}
這樣再重新編譯的時候就不會出現錯誤了!
添加回答
舉報