C++11中推出了一种特殊的关键字:mutable用于修饰类变量。 它的作用是标注该变量一定会被修改,因此也就不是const类型。 目的是为了使这些成员变量在被const关键字修饰的成员函数中使用时,可以被修改。
但是我们会发现一个问题,那就是不使用const修饰的变量本身就是可以修改的,那为什么还要添加mutable关键字呢? 这里涉及到一个用法,也是关于mutable的最常用的基本用法了。 如果不希望类成员函数修改类对象的状态,那么这个成员函数一般会被const修饰,修饰成员函数后就不可以更改成员变量。 如果我们需要在const成员函数中修改一些与类对象状态无关的成员变量,就可以用mutable来将这些成员变量修改为可变的。
直接看下面这个例子:
#include
class Car
{
public:
Car();
~Car();
int getPrice() const; /*调用方法 const成员函数*/
int getLen() const; /*调用方法 const成员函数*/
private:
int m_carPrice;
int m_carLen;
mutable int m_carNum;
};
Car::Car()
{
m_carPrice = 50000;
m_carLen = 5;
m_carNum = 5;
}
Car::~Car()
{
}
int Car::getPrice() const
{
m_carNum++; //此处修改是可以,因为对m_carNum进行了mutable限定
std::cout << m_carPrice << std::endl;
return m_carPrice ; // 无法修改该成员变量
}
int Car::getLen() const
{
return m_carLen; // 无法修改该成员变量
}
可以看到,在C++中被const修饰的成员函数无法修改类的成员变量,成员变量在该函数中处于只读状态。 然而,在某些场合我们还是需要在const成员函数中修改成员变量的值,被修改的成员变量与类本身并无多大关系,也许你会说,去掉函数的const关键字就行了。 可问题是,我只想修改某个变量的值,其他变量希望仍然被const关键字保护。 这样做相当于在函数中给mutable变量开了特例。
简单理解,在C++中,mutable就是为了突破成员函数 const的限制,可以在const函数里面来修改被mutable修饰的成员变量。 即使在一个const函数中,被mutable修饰的变量,将永远处于可变的状态。 这样,既保护了其他成员变量,又能达到我们单独修改成员变量count值的目的。
全部0条评论
快来发表一下你的评论吧 !