c++关键字mutable作用

在 C++ 中,mutable 是为了突破 const 的限制而设置的。被 mutable 修饰的变量,将永远处于可变的状态,即使在一个 const 函数中,甚至结构体变量或者类对象为 const,其 mutable 成员也可以被修改。

struct Test
{
    int a;
    mutable int b;
};

const struct Test test = {1,2};
test.a = 10;  # 编译错误
test.b = 20;  # 允许访问

mutable 在类中只能够修饰非静态数据成员。mutable 数据成员的使用看上去像是骗术,因为它能够使 const 函数修改对象的数据成员。然而,明智地使用 mutable 关键字可以提高代码质量,因为它能够让你向用户隐藏实现细节,而无须使用不确定的东西。我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成 const 的。但是,有些时候,我们需要在 const 的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被 mutalbe 来修饰。

class Test
{
private:
    int a;
    mutable int b;
public:

    void func2() const 
    {
        a++;  # 编译错误,不允许修改a
        b++;  # mutable修饰后允许修改
    }
};

const 承诺的是一旦某个变量被其修饰,那么只要不使用强制转换 (const_cast),在任何情况下该变量的值都不会被改变,无论有意还是无意,而被 const 修饰的函数也一样,一旦某个函数被 const 修饰,那么它便不能直接或间接改变任何函数体以外的变量的值,即使是调用一个可能造成这种改变的函数都不行。这种承诺在语法上也作出严格的保证,任何可能违反这种承诺的行为都会被编译器检查出来。

mutable 的承诺是如果某个变量被其修饰,那么这个变量将永远处于可变的状态,即使在一个 const 函数中。这与 const 形成了一个对称的定义,一个永远不变,而另外一个是永远可变。

看一个变量或函数是否应该是 const,只需看它是否应该是 constant 或 invariant,而看一个变量是否应该是 mutable,也只需看它是否是 forever mutative。

这里出现了令人纠结的 3 个问题:
1、为什么要保护类的成员变量不被修改?
2、为什么用 const 保护了成员变量,还要再定义一个 mutable 关键字来突破 const 的封锁线?
3、到底有没有必要使用 const 和 mutable 这两个关键字?

保护类的成员变量不在成员函数中被修改,是为了保证模型的逻辑正确,通过用 const 关键字来避免在函数中错误的修改了类对象的状态。并且在所有使用该成员函数的地方都可以更准确的预测到使用该成员函数的带来的影响。而 mutable 则是为了能突破 const 的封锁线,让类的一些次要的或者是辅助性的成员变量随时可以被更改。没有使用 const 和 mutable 关键字当然没有错,const 和 mutable 关键字只是给了建模工具更多的设计约束和设计灵活性,而且程序员也可以把更多的逻辑检查问题交给编译器和建模工具去做,从而减轻程序员的负担。

参考资料
https://blog.csdn.net/hellokandy/article/details/52317681

猜你喜欢

转载自blog.csdn.net/cl2010abc/article/details/80675137
今日推荐