当前位置: 首页 > news >正文

C++关键字之mutable

1.介绍

        在C++中,mutable是一个关键字,用于修饰类的成员变量。它的主要作用是允许在常量成员函数或常量对象中修改被标记为mutable的成员变量。通常情况下,常量成员函数不能修改类的成员变量,但有些情况下,某些成员变量的修改并不影响对象的逻辑状态(例如缓存、计数器等)。这时可以使用 mutable来允许这些变量在常量成员函数中被修改。

2.特点

        (1)允许在常量成员函数中修改。mutable变量可以在常量成员函数中被修改,而普通成员变量不行。

        (2)不影响对象的逻辑状态。mutable通常用于那些不影响对象外部可见状态的变量,例如缓存、调试计数器等。

        (3)常量对象也可以修改mutable变量。即使对象是const的,mutable变量仍然可以被修改。

3.使用语法

class MyClass {
public:
    mutable int mutableVar; // 使用 mutable 修饰
    int normalVar;

    void modify() const {
        mutableVar = 10; // 正确:mutable 变量可以在常量成员函数中修改
        // normalVar = 20; // 错误:不能修改普通成员变量
    }
};

4.使用场景

        (1)缓存数据

        如果某个成员变量用于缓存计算结果,且计算成本较高,可以使用mutable来允许在常量成员函数中更新缓存。

class Cache {
private:
    mutable bool cacheValid;
    mutable int cachedValue;

    int expensiveCalculation() const {
        // 模拟一个昂贵的计算
        return 42;
    }

public:
    Cache() : cacheValid(false), cachedValue(0) {} //成员初始化列表

    int getValue() const {
        if (!cacheValid) {
            cachedValue = expensiveCalculation(); // 更新缓存
            cacheValid = true;
        }
        return cachedValue;
    }
};

        (2)调试或统计

        用于记录函数调用次数等调试信息。

class Logger {
private:
    mutable int callCount;

public:
    Logger() : callCount(0) {}

    void log() const {
        callCount++; // 记录调用次数
        cout << "Log called " << callCount << " times" << endl;
    }
};

5.注意事项

        (1)不要滥用mutable,因为它会破坏常量成员函数的语义。只有在确实需要修改某些不影响对象逻辑状态的变量时才使用。

        (2)mutable不能用于修饰静态成员变量(static),因为静态成员变量不属于任何特定对象。

通过合理使用mutable,可以在保持常量成员函数语义的同时,灵活地处理一些特殊情况。

如有错误,敬请指正!!!


文章转载自:

http://Ik1Fy5bT.jjfyh.cn
http://wf23F9OM.jjfyh.cn
http://kRNtRANO.jjfyh.cn
http://eTJyw4SI.jjfyh.cn
http://54uuB4fv.jjfyh.cn
http://6rMt0fDq.jjfyh.cn
http://MNT4qOMj.jjfyh.cn
http://QV6ShgTZ.jjfyh.cn
http://aYbaqe8r.jjfyh.cn
http://jBXpX5Uq.jjfyh.cn
http://misPNFpv.jjfyh.cn
http://AZWffFje.jjfyh.cn
http://l9zaNxIe.jjfyh.cn
http://cIlD3gah.jjfyh.cn
http://BjTkB9sM.jjfyh.cn
http://pcTSvKVE.jjfyh.cn
http://QTHiHeCd.jjfyh.cn
http://0hvGjCO1.jjfyh.cn
http://5rodTzgL.jjfyh.cn
http://h4JE4z3N.jjfyh.cn
http://xKGp1RNB.jjfyh.cn
http://h7KmjgqG.jjfyh.cn
http://4KjNMBMQ.jjfyh.cn
http://wYUgJTIR.jjfyh.cn
http://3jy9RPsg.jjfyh.cn
http://XLRGTK7l.jjfyh.cn
http://mpakVD5h.jjfyh.cn
http://ENDr2aDt.jjfyh.cn
http://fYyx6VSU.jjfyh.cn
http://dmI7rroM.jjfyh.cn
http://www.dtcms.com/a/33358.html

相关文章:

  • Tesseract OCR:起源、发展与完整使用指南
  • 多线程篇学习面试
  • 请谈谈 Vue 中的 key 属性的重要性,如何确保列表项的唯一标识?
  • 设计模式Python版 中介者模式
  • Vue 3 + Vite 项目中配置代理解决开发环境中跨域请求问题
  • Linux系统管理与编程01:准备工作
  • vim 多个关键字高亮插件介绍
  • A. Jagged Swaps
  • mybatis从接口直接跳到xml的插件
  • 不同activity的mViewModel是复用同一个的还是每个activity都是创建新的ViewModel
  • DeepSeek各模型现有版本对比分析
  • Python selenium 库
  • 轻松将 Python 应用移植到 Android,p4a 帮你实现
  • 485. 最大连续 1 的个数
  • 深入了解ThreadLocal底层原理-高并发架构
  • LLM2CLIP论文学习笔记:强大的语言模型解锁更丰富的视觉表征
  • Hot100 动态规划
  • 【Java 面试 八股文】JVM 虚拟机篇
  • 三数之和:经典问题的多种优化策略
  • dlib 安装 comfy 节点确实处理
  • CentOS系统安装NFS
  • 计算机视觉:经典数据格式(VOC、YOLO、COCO)解析与转换(附代码)
  • 实战技巧:如何快速提高网站收录的多样性?
  • LangChain构建行业知识库实践:从架构设计到生产部署全指南
  • 【过程控制系统】第一章 过程控制系统的设计和发展趋势,确定系统变量和控制方案
  • 医疗AI领域中GPU集群训练的关键技术与实践经验探究(上)
  • 深入理解C语言中的枚举类型:基础、应用与最佳实践
  • 基于PSO粒子群优化的能源供应方,光伏发电,EV充电三方交易策略博弈算法matlab仿真
  • Node.js中如何修改全局变量的几种方式
  • Spring5框架八:整合Mybatis