浅谈C++的mutable关键字

描述

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值的目的。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分