Skip to content

C++ 中的 mutable 关键字

mutalbe 的中文意思是 "可变的,易变的",和 constant 是反义词。

在 C++ 中,mutable 也是为了突破 const 的限制而设置的。被 mutable 修饰的变量,将永远处于可变的状态,即使在一个 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 这个变量加一,但是 getAge() 方法又是 const 方法,无法修改 m_nums 这个变量,我又不想去掉 const 关键字让别人能够修改 age 等成员变量,这个时候 mutable 关键字就派上用场了。

所以把 m_nums 声明为 mutable 即可。这样我们既保护了别的成员变量,又能够使计数器的值进行累加。

#include <iostream>
class Person {
    ...
    mutable int m_nums;            /*用于统计次数*/
};

int Person::getCallingTimes() const { return m_nums; }
int Person::getAge() const
{
    m_nums++;
    // age = 4; 仍然无法修改该成员变量
    return age;
}

需要注意的是,mutable 不能修饰 conststatic 类型的变量。

const 关键字修饰的函数的一个重要作用就是为了能够保护类中的成员变量。即:该函数可以使用类中的所有成员变量,但是不能修改他们的值。然而,在某些特殊情况下,我们还是需要在 const 函数中修改类的某些成员变量,因为要修改的成员变量与类本身并无多少关系,即使修改了也不会对类造成多少影响。

当然,你可以说,你可以去掉该函数的 const 关键字呀!但问题是,我只想修改某个成员变量,其余成员变量仍然希望被 const 保护。

[1] https://www.cnblogs.com/yongdaimi/p/9565996.html

Comments