博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++关键字mutable作用
阅读量:2429 次
发布时间:2019-05-10

本文共 1425 字,大约阅读时间需要 4 分钟。

在 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 关键字只是给了建模工具更多的设计约束和设计灵活性,而且程序员也可以把更多的逻辑检查问题交给编译器和建模工具去做,从而减轻程序员的负担。

参考资料

转载地址:http://cwjmb.baihongyu.com/

你可能感兴趣的文章
笑死!996 程序员竟然做了这个梦!| 每日趣闻
查看>>
“再见,微软!”
查看>>
ARM 发布新一代 CPU 和 GPU,实现 20% 性能提升!
查看>>
技术引路:机器学习仍大有可为,但方向在哪里?
查看>>
漫画:如何给女朋友解释什么是编译与反编译
查看>>
刷屏了!这篇 Python 学习贴,90% 的程序员都用的上!
查看>>
漫画:如何给女朋友解释什么是适配器模式?
查看>>
程序员又迎来一个好消息! | 每日趣闻
查看>>
Mac 被曝存在恶意漏洞:黑客可随意调动摄像头,波及四百万用户!
查看>>
拒绝与其他码农一致!CSDN定制T让你成为最靓的仔
查看>>
程序员情商低?看完这 4 类程序员我懂了!
查看>>
《长安十二时辰》里你不能不知道的 IT 技术 | 每日趣闻
查看>>
程序员爬取 3 万条评论,《长安十二时辰》槽点大揭秘!
查看>>
一年参加一次就够,全新升级的 AI 开发者大会议程出炉!
查看>>
基于 XDanmuku 的 Android 性能优化实战
查看>>
基于嵌入式操作系统的物联网安全
查看>>
一个只有 99 行代码的 JS 流程框架
查看>>
移动周刊第 186 期:移动 App 客户端性能优化、iOS 开源库源码解析
查看>>
包学会之浅入浅出 Vue.js:开学篇
查看>>
JavaScriptCore 全面解析 (上篇)
查看>>