深入解析C++中的mutable關(guān)鍵字
mutalbe的中文意思是“可變的,易變的”,跟constant(既C++中的const)是反義詞。
在C++中,mutable也是為了突破const的限制而設(shè)置的。被mutable修飾的變量,將永遠(yuǎn)處于可變的狀態(tài),即使在一個const函數(shù)中。
我們知道,如果類的成員函數(shù)不會改變對象的狀態(tài),那么這個成員函數(shù)一般會聲明成const的。但是,有些時候,我們需要在const的函數(shù)里面修改一些跟類狀態(tài)無關(guān)的數(shù)據(jù)成員,那么這個數(shù)據(jù)成員就應(yīng)該被mutalbe來修飾。
下面是一個小例子:
class ClxTest
{
public:
void Output() const;
};
void ClxTest::Output() const
{
cout << "Output for test!" << endl;
}
void OutputTest(const ClxTest& lx)
{
lx.Output();
}
類ClxTest的成員函數(shù)Output是用來輸出的,不會修改類的狀態(tài),所以被聲明為const的。
函數(shù)OutputTest也是用來輸出的,里面調(diào)用了對象lx的Output輸出方法,為了防止在函數(shù)中調(diào)用其他成員函數(shù)修改任何成員變量,所以參數(shù)也被const修飾。
如果現(xiàn)在,我們要增添一個功能:計算每個對象的輸出次數(shù)。如果用來計數(shù)的變量是普通的變量的話,那么在const成員函數(shù)Output里面是不能修改該變量的值的;而該變量跟對象的狀態(tài)無關(guān),所以應(yīng)該為了修改該變量而去掉Output的const屬性。這個時候,就該我們的mutable出場了——只要用mutalbe來修飾這個變量,所有問題就迎刃而解了。
下面是修改過的代碼:
class ClxTest
{
public:
ClxTest();
~ClxTest();
void Output() const;
int GetOutputTimes() const;
private:
mutable int m_iTimes;
};
ClxTest::ClxTest()
{
m_iTimes = 0;
}
ClxTest::~ClxTest()
{}
void ClxTest::Output() const
{
cout << "Output for test!" << endl;
m_iTimes++;
}
int ClxTest::GetOutputTimes() const
{
return m_iTimes;
}
void OutputTest(const ClxTest& lx)
{
cout << lx.GetOutputTimes() << endl;
lx.Output();
cout << lx.GetOutputTimes() << endl;
}
計數(shù)器m_iTimes被mutable修飾,那么它就可以突破const的限制,在被const修飾的函數(shù)里面也能被修改。
相關(guān)文章
深入理解C++中的new/delete和malloc/free動態(tài)內(nèi)存管理及區(qū)別介紹
這篇文章主要介紹了深入理解C++中的new/delete和malloc/free動態(tài)內(nèi)存管理,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09C++結(jié)構(gòu)體struct和類class區(qū)別詳解
struct和class有什么區(qū)別?最本質(zhì)的一個區(qū)別就是默認(rèn)的訪問控制:默認(rèn)的繼承訪問權(quán)限,struct是public的,class是private的。2017-11-11關(guān)于VS+QT5應(yīng)用程序換圖標(biāo)的解決方案
這篇文章主要介紹了VS+QT5應(yīng)用程序換圖標(biāo)的處理方案,本文給大家提供了兩種解決方案供大家參考,每種方法給大家講解的都非常詳細(xì),需要的朋友可以參考下2021-12-12詳解C++中對構(gòu)造函數(shù)和賦值運(yùn)算符的復(fù)制和移動操作
這篇文章主要介紹了C++中對構(gòu)造函數(shù)和賦值運(yùn)算符的復(fù)制和移動,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2016-01-01C++ Qt實現(xiàn)瀏覽器網(wǎng)頁內(nèi)嵌的音視頻播放器
這篇文章主要為大家詳細(xì)介紹了如何利用C++ Qt實現(xiàn)瀏覽器網(wǎng)頁內(nèi)嵌的音視頻播放器,并支持軟硬解碼,支持音頻,支持錄像截圖,支持多路播放等,感興趣的可以了解下2024-01-01