全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++中的mutable关键字有什么作用?C++ const成员函数内修改变量【冷门知识】

mutable允许const成员函数修改特定成员变量,用于缓存、计数器、互斥锁等不影响对象逻辑状态的内部可变数据,需配合线程同步且仅适用于非静态非const非引用类成员。

mutable 的作用是:让被它修饰的成员变量,即使在 const 成员函数中也能被修改

为什么需要 mutable?

const 成员函数承诺“不修改对象的逻辑状态”,但有些变量(比如缓存、计数器、互斥锁)的修改不影响外部可见行为。编译器默认不允许任何修改,mutable 就是用来给这类“逻辑上可变、语义上不变”的变量开绿灯

典型场景包括:

  • 缓存计算结果(如懒加载的哈希值、字符串长度)
  • 统计调用次数(如调试用的访问计数器)
  • 线程安全所需的 mutable mutex(C++17 起 std::mutex 是可变的)

基本用法示例

看这段代码:

class Data {
  mutable int cache_;
  mutable bool cached_;
  std::string content_;

public:
  Data(const std::string& s) : content_(s), cache_(0), cached_(false) {}

  int getLength() const {
    if (!cached_) {
      cache_ = content_.size(); // ✅ 允许修改 mutable 成员
      cached_ = true; // ✅ 同样允许
    }
    return cache_;
  }
};

没有 mutable,这两行赋值会编译失败——因为 getLength() 是 const 函数。

关键限制和注意事项

mutable 只能用于非静态、非 const、非引用类型的类成员变量。它不能修饰局部变量、全局变量或参数。

常见误区:

  • 不能绕过 const 对象的整体只读性(比如不能通过 mutable 修改影响 const 正确性的核心数据)
  • mutable 不改变类型,只是放宽 const 成员函数中的修改权限
  • 多个线程同时访问 mutable 成员时,仍需同步(mutable 不提供线程安全)

一个实用的线程安全例子

配合 mutable std::mutex 实现 const 函数内的线程安全缓存:

class ExpensiveCalc {
  mutable std::mutex mtx_;
  mutable std::optional result_;

public:
  int compute() const {
    std::lock_guard<:mutex> lock(mtx_);
    if (!result_) {
      result_ = heavy_work(); // ✅ 在 const 函数里更新缓存
    }
    return *result_;
  }
};

这里 mtx_result_ 都是 mutable,才能在 const 函数中加锁并写入。

基本上就这些。mutable 不复杂,但容易忽略——它不是用来破坏 const 原则的,而是帮你在坚守语义 const 的前提下,合理管理内部可变状态。


# 懒加载  # c++  # 为什么  # String  # if  # 成员变量  # 成员函数  # const  # 局部变量  # 全局变量  # 字符串  # bool  # int  # mutable  # class  # 引用类型  # public  # 线程  # 对象  # 都是  # 互斥  # 多个  # 你在  # 也能  # 适用于  # 所需  # 这段  # 能在  # 这类 


相关文章: 如何通过虚拟主机快速完成网站搭建?  电商网站制作价格怎么算,网上拍卖流程以及规则?  香港服务器部署网站为何提示未备案?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  建站之星如何助力网站排名飙升?揭秘高效技巧  TestNG的testng.xml配置文件怎么写  如何做网站制作流程,*游戏网站怎么搭建?  建站主机选虚拟主机还是云服务器更好?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何选择靠谱的建站公司加盟品牌?  移民网站制作流程,怎么看加拿大移民官网?  如何在建站宝盒中设置产品搜索功能?  制作营销网站公司,淘特是干什么用的?  香港服务器WordPress建站指南:SEO优化与高效部署策略  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  如何在阿里云通过域名搭建网站?  宝塔Windows建站如何避免显示默认IIS页面?  如何在IIS管理器中快速创建并配置网站?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  如何获取PHP WAP自助建站系统源码?  建站为何优先选择香港服务器?  建站之星价格显示格式升级,你的预算足够吗?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  如何用免费手机建站系统零基础打造专业网站?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  如何在局域网内绑定自建网站域名?  制作公司内部网站有哪些,内网如何建网站?  制作电商网页,电商供应链怎么做?  建站之星CMS五站合一模板配置与SEO优化指南  重庆网站制作公司哪家好,重庆中考招生办官方网站?  定制建站方案优化指南:企业官网开发与建站费用解析  在线制作视频的网站有哪些,电脑如何制作视频短片?  如何基于PHP生成高效IDC网络公司建站源码?  如何在搬瓦工VPS快速搭建网站?  如何快速完成中国万网建站详细流程?  微信小程序 五星评分(包括半颗星评分)实例代码  建站主机选哪种环境更利于SEO优化?  建站主机选购指南:核心配置与性价比推荐解析  如何构建满足综合性能需求的优质建站方案?  如何解决ASP生成WAP建站中文乱码问题?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  如何在服务器上配置二级域名建站?  如何零成本快速生成个人自助网站?  如何选购建站域名与空间?自助平台全解析  长沙做网站要多少钱,长沙国安网络怎么样? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。