【C++】011、mutable关键字

一、mutable作用

  • mutable的设计目的,是为了允许类成员变量在const成员成函数中被修改

二、mutable修饰的成员变量破坏了const成员函数的限制规则

const修饰的成员函数规则:

  • 不允许修改任何非静态成成员变量

  • 不允许调用其他非const成员函数

但mutable关键字破坏了第一个规则

  • 代码
cpp 复制代码
class MyClass {
private:
    int age;              // 普通变量
    mutable int cache;    // mutable变量

public:
    void setAge(int a) const { 
        // age = a;       // ❌ 编译报错!const函数中不能修改普通成员
        cache = a;        // ✅ OK!mutable变量可以在const函数中修改
    }
};

三、mutable使用场景

1、惰性缓存

  • 使用const函数返回对象数据

  • 但是这个函数希望第一次读取时计算数据并进行缓存结果,后续直接返回缓存值

  • 则mutable修饰的成员变量,可满足上面的要求

  • 代码

cpp 复制代码
class DataProcessor {
private:
    std::string raw_data;
    mutable bool cache_valid;      // 缓存是否有效(需在const中修改)
    mutable int cached_result;     // 缓存的结果(需在const中修改)

public:
    int getResult() const {        // 逻辑上是只读函数,标记为const
        if (!cache_valid) {
            // 执行昂贵计算(如遍历大数据)...
            cached_result = raw_data.size() * 10; 
            cache_valid = true;    // ✅ 因为是mutable,所以可以在const函数中修改
        }
        return cached_result;
    }
};

2、使用mutable修饰的互斥锁对象,实现线程安全的const函数

  • 将互斥锁Mutex声明为mutable,让const函数能安全地加锁

  • 代码

cpp 复制代码
#include <mutex>
class ThreadSafeCounter {
private:
    mutable std::mutex mtx;    // 锁必须是mutable,因为const函数中需要上锁
    int value = 0;

public:
    int get() const {          // 获取值,逻辑上只读
        std::lock_guard<std::mutex> lock(mtx); // ✅ 调用 mtx.lock() 改变锁状态
        return value;
    }
};
相关推荐
1024奇点几秒前
【仓颉语言入门 · 第二篇 第 8 课】
开发语言·数据库·ide·mysql·开源
萧瑟余晖3 分钟前
Spring Security综合实战与安全加固详解
java·安全·spring
gopher951115 分钟前
RUST:序列化与反序列化 serde + derive 详解
开发语言·后端·rust
imDwAaY17 分钟前
操作系统如何管理程序运行?从线程、进程到内存隔离与用户态切换:CS162 Note2
android·java·redis
const_qiu22 分钟前
第三章 08:3.10 本章小结
java·人工智能
Pniubi22 分钟前
快速排序(力扣基础)(递归)
java·数据结构·算法
H.莓飛39 分钟前
【Linux】自主 Shell
linux·运维·服务器·c语言·开发语言·visual studio
CarIise40 分钟前
Spring MVC 请求参数绑定与常用注解2
java·spring·mvc
熊猫钓鱼>_>42 分钟前
Kotlin Multiplatform for OpenHarmony 实战:kotlinx-coroutines 结构化并发适配
开发语言·kotlin·agent·harmonyos·openharmony·适配·华为云码道
七夜zippoe1 小时前
Spring Boot 接通义千问:从拿 Key 到第一个对话接口跑通(保姆级)
java·spring boot·后端