C++中的mutable关键字有什么用途?(在const函数中修改成员)

技术百科 穿越時空 发布时间:2026-01-21 浏览:
mutable的核心用途是允许在const成员函数中修改特定成员变量而不破坏对象逻辑常量性;它用于缓存、计数、互斥锁等不影响对象对外状态的内部可变数据,仅限非静态数据成员,不可与const共用。

mutable 的核心用途是:允许在 const 成员函数中修改特定成员变量,同时不破坏对象整体的逻辑常量性。

解决 const 函数中的“合理可变”需求

有些成员变量并不影响对象对外表现的逻辑状态,比如缓存、访问计数、互斥锁等。它们的修改不会改变对象“是什么”,只影响“怎么用”。mutable 就是用来标记这类变量的。

  • 被 mutable 修饰的成员,即使在 const 成员函数里也能被赋值
  • 它不改变 this 指针的 const 性质,也不影响其他成员的只读约束
  • 编译器不会对 mutable 成员做 const 正确性检查

典型使用场景

常见于需要内部状态更新但又不想暴露非常量接口的地方:

  • 缓存计算结果:比如一个 const 函数首次调用时计算并缓存结果,后续直接返回
  • 统计访问次数:记录某 const 接口被调用了多少次,用于调试或监控
  • 线程安全辅助:mutable std::mutex 可在 const 函数中加锁(因为 lock() 是非 const 成员)

语法要点和限制

mutable 只能用于类的非静态数据成员,不能用于全局变量、局部变量、static 成员或函数参数:

  • 声明时写在类型前,例如:mutable int cache_valid;
  • 不能与 const 同时修饰同一个成员(语义冲突)
  • 不能用于引用或 const 类型成员(但可以用于 mutable const int* —— 指针本身可变,指向内容仍不可变)

一个简单例子

下面代码中,get_value() 是 const 函数,但依然能更新 cached_valueis_cached

class Calculator {
    mutable int cached_value = 0;
    mutable bool is_cached = false;
    int base_data = 42;

public: int get_value() const { if (!is_cached) { cached_value = base_data * 2; // OK:mutable 成员可修改 is_cached =

true; // OK:同上 } return cached_value; } };


# 这类  # 也不  # 但又  # 也能  # 而不  # 可在  # 首次  # 会对  # 时计  # 对象  # c++  # int  # 指针  # 接口  # 线程  # Static  # this  # 成员变量  # 成员函数  # const  # 局部变量  # 全局变量  # 常量  # 互斥  # mutable 


相关栏目: <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 AI推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 SEO优化<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 技术百科<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 谷歌推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 百度推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 网络营销<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 案例网站<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 精选文章<?muma echo $count; ?>

相关推荐

在线咨询

点击这里给我发消息QQ客服

在线咨询

免费通话

24h咨询:4006964355


如您有问题,可以咨询我们的24H咨询电话!

免费通话

微信扫一扫

微信联系
返回顶部