欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c++關(guān)鍵字mutable深入解析

 更新時間:2013年09月26日 09:57:47   投稿:jingxian  
先說用法,mutable關(guān)鍵字只能修飾非靜態(tài)以及非常量成員變量,使用mutable修飾的成員變量在const函數(shù)中的值是可以修改的

C++中的mutable關(guān)鍵字

mutalbe的中文意思是“可變的,易變的”,跟constant(既C++中的const)是反義詞。

在C++中,mutable也是為了突破const的限制而設(shè)置的。被mutable修飾的變量,將永遠(yuǎn)處于可變的狀態(tài),即使在一個const函數(shù)中。

我們知道,被const關(guān)鍵字修飾的函數(shù)的一個重要作用就是為了能夠保護(hù)類中的成員變量。即:該函數(shù)可以使用類中的所有成員變量,但是不能修改他們的值。然而,在某些特殊情況下,我們還是需要在const函數(shù)中修改類的某些成員變量,因?yàn)橐薷牡某蓡T變量與類本身并無多少關(guān)系,即使修改了也不會對類造成多少影響。當(dāng)然,你可以說,你可以去掉該函數(shù)的const關(guān)鍵字呀!但問題是,我只想修改某個成員變量,其余成員變量仍然希望被const保護(hù)。

經(jīng)典的應(yīng)用場景比如說:我要測試一個方法的被調(diào)用次數(shù)。

class Person {
public:
 Person();
 ~Person();

 int getAge() const; /*調(diào)用方法*/
 int getCallingTimes() const; /*獲取上面的getAge()方法被調(diào)用了多少次*/
private:
 int age;
 char *name;
 float score;
 int m_nums;  /*用于統(tǒng)計(jì)次數(shù)*/
};

最普遍的作法就是在getAge()的方法體內(nèi)對m_nums這個變量進(jìn)行加+1,但是getAge()方法又是const方法,無法修改m_nums這個變量,我又不想去掉const關(guān)鍵字讓別人能夠修改age等成員變量,這個時候mutable關(guān)鍵字就派上用場了:

#include <iostream>

class Person {
public:
 Person();
 ~Person();

 int getAge() const; /*調(diào)用方法*/
 int getCallingTimes() const; /*獲取上面的getAge()方法被調(diào)用了多少次*/
private:
 int age;
 char *name;
 float score;
 mutable int m_nums;  /*用于統(tǒng)計(jì)次數(shù)*/
};

Person::Person()
{
 m_nums = 0;
}

Person::~Person(){}

int Person::getAge() const
{
 std::cout << "Calling the method" << std::endl;
 m_nums++;
 // age = 4; 仍然無法修改該成員變量
 return age;
}

int Person::getCallingTimes()const
{
 return m_nums;
}

int main()
{
 Person *person = new Person();
 for (int i = 0; i < 10; i++) {
 person->getAge();
 }
 std::cout << "getAge()方法被調(diào)用了" << person->getCallingTimes() << "次" << std::endl;
 delete person;

 getchar();
 return 0;
}

運(yùn)行結(jié)果:

Calling the method
Calling the method
Calling the method
Calling the method
Calling the method
Calling the method
Calling the method
Calling the method
Calling the method
Calling the method

getAge()方法被調(diào)用了10次

這樣我們既保護(hù)了別的成員變量,又能夠使計(jì)數(shù)器的值進(jìn)行累加。

需要注意的是:mutable不能修飾const 和 static 類型的變量。

1、關(guān)于mutable關(guān)鍵字

先說用法,mutable關(guān)鍵字只能修飾非靜態(tài)以及非常量成員變量,使用mutable修飾的成員變量在const函數(shù)中的值是可以修改的。

比如說下面的代碼:

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 ;
}

編譯的時候會報(bào)錯,因?yàn)閏onst成員函數(shù)修改了成員變量,但是如果聲明m_nAccess的時候加上關(guān)鍵字mutable就可以了。

PS:一個對象的狀態(tài)由該對象的非靜態(tài)數(shù)據(jù) 成員決定,所以隨著數(shù)據(jù)成員的改變, 對像的狀態(tài)也會隨之發(fā)生變化! 如果一個類的成員函數(shù)被聲明為const類型,表示該函數(shù)不會改變對象的狀態(tài),也就是該函數(shù)不會修改類的非靜態(tài)數(shù)據(jù)成員.但是有些時候需要在該類函數(shù)中對類的數(shù)據(jù)成員進(jìn)行賦值.這個時候就需要用到mutable關(guān)鍵字了。

相關(guān)文章

  • C語言實(shí)現(xiàn)BMP圖像處理(直方圖均衡化)

    C語言實(shí)現(xiàn)BMP圖像處理(直方圖均衡化)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)BMP圖像直方圖均衡化處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • c語言實(shí)現(xiàn)http下載器的方法

    c語言實(shí)現(xiàn)http下載器的方法

    這篇文章主要介紹了c語言實(shí)現(xiàn)http下載器的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • C++實(shí)現(xiàn)藍(lán)橋杯競賽題目---搭積木

    C++實(shí)現(xiàn)藍(lán)橋杯競賽題目---搭積木

    這篇文章主要介紹了C++實(shí)現(xiàn)藍(lán)橋杯競賽題目---搭積木,本篇文章通過題目分析列舉公式進(jìn)行分析算法,包含詳細(xì)的圖文,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Qt動態(tài)庫調(diào)用宿主進(jìn)程中的對象方法純虛函數(shù)使用

    Qt動態(tài)庫調(diào)用宿主進(jìn)程中的對象方法純虛函數(shù)使用

    這篇文章主要為大家介紹了Qt動態(tài)庫調(diào)用宿主進(jìn)程中的對象方法純虛函數(shù)使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 一起聊聊C++中的智能指針

    一起聊聊C++中的智能指針

    C++?是手工管理內(nèi)存的分配和釋放,這給了程序員極大的自由度也給了我們極高的門檻,弄不好就得內(nèi)存泄露。使用智能指針能更好的管理堆內(nèi)存,本文主要給大家介紹一下c++的智能指針,需要的朋友可以參考下
    2022-07-07
  • C++服務(wù)器和客戶端交互的項(xiàng)目實(shí)踐

    C++服務(wù)器和客戶端交互的項(xiàng)目實(shí)踐

    本文主要介紹了C++服務(wù)器和客戶端交互的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • C語言直接插入排序算法

    C語言直接插入排序算法

    大家好,本篇文章主要講的是C語言直接插入排序算法,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C語言、C++內(nèi)存對齊問題詳解

    C語言、C++內(nèi)存對齊問題詳解

    這篇文章主要介紹了C語言、C++內(nèi)存對齊問題詳解,內(nèi)存對齊的問題主要存在于理解struct和union等復(fù)合結(jié)構(gòu)在內(nèi)存中的分布,需要的朋友可以參考下
    2014-10-10
  • C++ 讀取文件內(nèi)容到指定類型的變量方法

    C++ 讀取文件內(nèi)容到指定類型的變量方法

    今天小編就為大家分享一篇C++ 讀取文件內(nèi)容到指定類型的變量方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • C語言?隊(duì)列的實(shí)現(xiàn)全解析

    C語言?隊(duì)列的實(shí)現(xiàn)全解析

    隊(duì)列(Queue)與棧一樣,是一種線性存儲結(jié)構(gòu),它具有如下特點(diǎn):隊(duì)列中的數(shù)據(jù)元素遵循“先進(jìn)先出”(First?In?First?Out)的原則,簡稱FIFO結(jié)構(gòu)。在隊(duì)尾添加元素,在隊(duì)頭刪除元素
    2022-04-04

最新評論