C++中的mutable關鍵字
mutalbe的中文意思是“可變的,易變的”,跟constant(既C++中的const)是反義詞。
在C++中,mutable也是為了突破const的限制而設定的。被mutable修飾的變量,将永遠處于可變的狀态,即使在一個const函數中。
我們知道,被const關鍵字修飾的函數的一個重要作用就是為了能夠保護類中的成員變量。即:該函數可以使用類中的所有成員變量,但是不能修改他們的值。然而,在某些特殊情況下,我們還是需要在const函數中修改類的某些成員變量,因為要修改的成員變量與類本身并無多少關系,即使修改了也不會對類造成多少影響。當然,你可以說,你可以去掉該函數的const關鍵字呀!但問題是,我隻想修改某個成員變量,其餘成員變量仍然希望被const保護。
經典的應用場景比如說:我要測試一個方法的被調用次數。
class Person {
public:
Person();
~Person();
int getAge() const; /*調用方法*/
int getCallingTimes() const; /*擷取上面的getAge()方法被調用了多少次*/
private:
int age;
char *name;
float score;
int m_nums; /*用于統計次數*/
};
最普遍的作法就是在getAge()的方法體内對m_nums這個變量進行加+1,但是getAge()方法又是const方法,無法修改m_nums這個變量,我又不想去掉const關鍵字讓别人能夠修改age等成員變量,這個時候mutable關鍵字就派上用場了:
#include <iostream>
class Person {
public:
Person();
~Person();
int getAge() const; /*調用方法*/
int getCallingTimes() const; /*擷取上面的getAge()方法被調用了多少次*/
private:
int age;
char *name;
float score;
mutable int m_nums; /*用于統計次數*/
};
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()方法被調用了" << person->getCallingTimes() << "次" << std::endl;
delete person;
getchar();
return 0;
}
運作結果:
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()方法被調用了10次
這樣我們既保護了别的成員變量,又能夠使計數器的值進行累加。
需要注意的是:mutable不能修飾const 和 static 類型的變量。