最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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修飾的變量,將永遠處于可變的狀態(tài),即使在一個const函數(shù)中。

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

經(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)計次數(shù)*/
};

最普遍的作法就是在getAge()的方法體內(nèi)對m_nums這個變量進行加+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)計次數(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;
}

運行結(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次

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

需要注意的是: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 ;
}

編譯的時候會報錯,因為const成員函數(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ù)成員進行賦值.這個時候就需要用到mutable關(guān)鍵字了。

相關(guān)文章

  • C語言代碼實現(xiàn)推箱子小游戲

    C語言代碼實現(xiàn)推箱子小游戲

    這篇文章主要為大家詳細介紹了C語言代碼實現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C語言實現(xiàn)簡單的飛機大戰(zhàn)游戲

    C語言實現(xiàn)簡單的飛機大戰(zhàn)游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的飛機大戰(zhàn)游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 詳解C++賦值操作符重載

    詳解C++賦值操作符重載

    這篇文章主要介紹了C++賦值操作符重載的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • C++運算符重載限制介紹

    C++運算符重載限制介紹

    這篇文章主要介紹了C++運算符重載限制,關(guān)于運算符的重載并不是隨心所欲的。C++給出了一些限制,從而保證了規(guī)范,以及程序運行的準(zhǔn)確性,下面來了解C++運算符重載限制的詳細內(nèi)容吧,需要的朋友也可以參考一下
    2022-01-01
  • c++中的system(

    c++中的system("pause")的作用和含義解析

    這篇文章主要介紹了c++中system("pause")的作用和含義,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-03-03
  • C++字符串輸入緩沖區(qū)機制詳解

    C++字符串輸入緩沖區(qū)機制詳解

    緩沖區(qū)是用來存放流中的數(shù)據(jù),本文詳細的介紹了C++字符串輸入緩沖區(qū)機制,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-10-10
  • 一篇文章帶你了解C++中的異常

    一篇文章帶你了解C++中的異常

    這篇文章主要為大家詳細介紹了C++中的異常,使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++ 類的賦值運算符''''=''''重載的方法實現(xiàn)

    C++ 類的賦值運算符''''=''''重載的方法實現(xiàn)

    這篇文章主要介紹了C++ 類的賦值運算符'='重載的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C++中4種強制類型轉(zhuǎn)換的區(qū)別詳析

    C++中4種強制類型轉(zhuǎn)換的區(qū)別詳析

    這篇文章主要給大家介紹了關(guān)于C++中4種強制類型轉(zhuǎn)換區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C語言結(jié)構(gòu)體指針引用詳解

    C語言結(jié)構(gòu)體指針引用詳解

    C語言中結(jié)構(gòu)體指針,可細分為指向結(jié)構(gòu)體變量的指針和指向結(jié)構(gòu)體數(shù)組的指針。本文將詳細為大家介紹一下這兩種結(jié)構(gòu)體指針如何引用,需要的小伙伴可以參考一下
    2021-12-12

最新評論

安化县| 沾益县| 和林格尔县| 邵武市| 东兴市| 望城县| 逊克县| 商洛市| 阳山县| 绥中县| 普兰县| 武陟县| 布尔津县| 禄丰县| 大石桥市| 淮南市| 云龙县| 玛多县| 丹东市| 邵东县| 马公市| 凤阳县| 三江| 上饶市| 阆中市| 湘潭县| 海盐县| 江永县| 南川市| 曲周县| 辉县市| 苏尼特左旗| 潞西市| 德州市| 福建省| 临洮县| 定兴县| 长治县| 汾阳市| 盖州市| 旺苍县|