讲师中心 微信公众号
AI工具推荐 视频效率加速

c++中mutable关键字有什么用_c++ const成员函数修改变量【进阶】

陌瑶姑娘_7674

陌瑶姑娘_7674

发布时间:2026-02-03 14:41:02

|

205人浏览过

|

来源于php中文网

原创

const成员函数中修改成员变量必须用mutable,因为它唯一合法地允许在不改变对象逻辑状态的前提下解除const限制,适用于缓存、访问计数等不影响可观察行为的辅助状态。

c++中mutable关键字有什么用_c++ const成员函数修改变量【进阶】

const 成员函数里想改某个成员变量,为什么必须用 mutable

因为 C++ 标准规定:const 成员函数中,所有非 mutable 的成员变量都被视为只读。编译器会直接拒绝修改它们——哪怕你只是想缓存计算结果、更新访问计数或做日志标记这类不改变对象“逻辑状态”的操作。

这时候 mutable 就是唯一合法的“例外通行证”。它告诉编译器:“这个变量的修改不影响对象对外表现出的 const 性质。”

  • mutable 只能用于类的非静态数据成员,不能用于局部变量、全局变量或 static 成员
  • 它不改变变量的访问权限(public/protected/private),只解除 const 函数的写入限制
  • 即使对象本身是 const 对象,也能通过 const 成员函数修改 mutable 成员

哪些场景下 mutable 是合理且必要的

关键判断标准:修改该变量是否影响对象的“可观察行为”——即调用者通过 public 接口能否感知到变化。如果不能,就适合用 mutable。

  • 缓存计算结果(如 mutable std::optional<int> cached_result;),避免重复开销
  • 线程安全的懒初始化(配合 std::call_once 和 mutable std::once_flag flag;)
  • 调试用的访问计数器(mutable int access_count = 0;),不影响功能逻辑
  • 与外部系统交互的状态标记(如 mutable bool is_logged = false;),仅用于内部追踪

不用 mutable 的常见错误尝试及后果

很多人试图绕过限制,结果要么编译失败,要么引发未定义行为。

Web Accessibility (WCAG 2 AA))
Web Accessibility (WCAG 2 AA))

将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。

下载

立即学习“C++免费学习笔记(深入)”;

  • 在 const 函数里直接赋值给普通成员变量 → 编译错误:assignment of member 'x' in read-only object
  • 用 const_cast 强转 this 指针再修改 → 编译通过但属于未定义行为(UB),尤其当原对象本身是 const 时
  • 把变量改成 static → 失去对象粒度,所有实例共享,破坏封装和多线程安全性
  • 把变量移到类外(如全局 map)→ 增加耦合、难以维护、无法自动析构

mutable 不解决什么问题,别误用

mutable 不是用来“让 const 函数变得不 const”,它只为极少数真正符合语义的辅助性状态而存在。一旦变量参与对象的核心逻辑,比如影响 operator==、hash 或序列化结果,就不能标 mutable。

  • 如果修改后会导致两次调用同一个 const 函数返回不同结果(且这不是缓存机制导致的),说明它不该是 mutable
  • mutable 成员仍受构造/析构生命周期约束,不能在构造函数里被 const 成员函数访问(此时对象尚未完全构造)
  • 在 constexpr 成员函数中,mutable 成员依然不可修改——constexpr 要求更严格

最容易被忽略的一点:mutable 不提供线程安全。多个线程同时写同一个 mutable 成员,必须自己加锁或用原子类型。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2278

2023.09.20

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

4725

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

1970

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

4725

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

1970

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6639

2023.08.02

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 7.4万人学习

C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn