新闻中心

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

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

c++中的mutable关键字有什么作用?c++ 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、非引用类型的类成员变量。它不能修饰局部变量、全局变量或参数。

Gaga Gaga

曹越团队开发的AI视频生成工具

Gaga 1151 查看详情 Gaga

常见误区:

  • 不能绕过 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_ = he*y_work(); // ✅ 在 const 函数里更新缓存
    }
    return *result_;
  }
};

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

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

以上就是C++中的mutable关键字有什么作用?C++ const成员函数内修改变量【冷门知识】的详细内容,更多请关注其它相关文章!


# c++  # 懒加载  # 互斥  # 都是  # 如何实现  # 多线程  # 如何使用  # 全局变量  # 加载  # 有什么  # 为什么  # 想在抖音推广公司网站  # 网店的推广营销方法  # 网站竞价推广统计表  # 优化营销推广费用  # 深圳娱乐文创营销推广  # 新城网站排名优化  # 营销推广地图  # 黄岛区学校网站建设  # 邯郸营销推广网招聘信息  # 滕州网站推广团队  # 你在  # 多个 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 抖音极速版最新版本 抖音极速版官方下载地址  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析  手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析  Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区  React/Next.js中实现列表项的动态选择与移动  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  126邮箱账号注册 电脑版登录入口  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算  动漫花园资源网使用步骤_动漫花园资源网下载流程  魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】  在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析  qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  深入理解与实现最大堆的Heapify过程:常见错误与修正  C++ explicit关键字防止隐式转换_C++构造函数安全规范  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口  Shopware订单对象中获取产品自定义字段的正确方法  KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程  MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具  mysql如何设置表访问权限_mysql表访问权限配置  AO3镜像入口大全 AO3网页版内容访问全集  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  漫蛙网页登录入口 漫蛙漫画官方授权网址  一加 14R 快充无反应_一加 14R 充电优化  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  浏览器打开即用 美图秀秀网页版入口  C++ vector二维数组定义_C++ vector of vector用法  随机参数递归函数的基准调用次数与时间复杂度探究  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  AI泡沫首次被“刺破”:GPU十年都无法存活!  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  CSS Box Model与弹性按钮:维持布局稳定的动画实践  Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  Lar*el Form Request中唯一性验证在更新操作中的正确实现  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  12306选座系统怎么选连座_12306选座多人连坐操作方法  腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  J*aScript对象创建方式_J*aScript设计模式应用  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  2026春节假期票务安排_2026春节放假购票指南  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧 

搜索