C++关键字之mutable

devtools/2025/2/28 3:05:18/

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://www.ppmy.cn/devtools/163232.html

相关文章

Redis分布式缓存面试题

为什么使用分布式缓存&#xff1f; 1. 提升性能 降低延迟&#xff1a;将数据缓存在离应用更近的地方&#xff0c;减少数据访问时间。减轻数据库压力&#xff1a;缓存频繁访问的数据&#xff0c;减少对后端数据库的请求&#xff0c;提升系统响应速度。 2. 扩展性 水平扩展&a…

Linux基础开发工具的使用(apt、vim、gcc、g++、gdb、make、makefile)

Linux软件包管理器–apt Linux安装软件的方式 在Linux下安装软件的方法有以下三种&#xff1a; 下载到程序的源代码&#xff0c;自己编译出可执行程序获取deb安装包、然后使用dpkg命令安装。&#xff08;不解决依赖关系&#xff09;通过apt进行安装软件。 小知识点&#xf…

云计算如何解决延迟问题?

在云计算中&#xff0c;延迟&#xff08;latency&#xff09;指的是从请求发出到收到响应之间的时间间隔。延迟过高可能会严重影响用户体验&#xff0c;特别是在需要实时响应的应用中&#xff0c;如在线游戏、视频流、金融交易等。云计算服务如何解决延迟问题&#xff0c;通常依…

汽车结构胶仿真模型MAT_169材料卡片的制作

随着汽车轻量化技术的发展&#xff0c;车身所用材料呈现出多样化的趋势&#xff0c;由于异种材料之间的物理、化学和力学性能方面存在较大差异&#xff0c;因此多材料轻量化车身对连接技术提出了新的挑战。 传统点焊连接由于技术瓶颈和成本的原因&#xff0c;无法广泛应用于异种…

力扣hot100 —— 电话号码字母组合; 子集 (非回溯做法)简单易懂

由于博主对回溯也不是很熟悉&#xff0c;这里提出一种简单易懂的解法&#xff08;有点暴力&#xff09; 解题思路&#xff1a; 每个数字对应有自己的字母串&#xff1b; 首先遍历将每个字母存入也就是 res{{a},{b},{c}} 然后遍历后续数子对应的字母&#xff0c;让每个字母与…

【自学笔记】Vue基础知识点总览-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 引言Vue基础知识概览1. Vue实例2. 模板语法3. 计算属性4. 事件处理 总结 引言 Vue.js是一个构建用户界面的渐进式框架&#xff0c;以其简洁的API和易于上手的特点受…

【鸿蒙应用开发】性能优化

渲染方面 Repeat&#xff1a;可复用的循环渲染 Repeat 一般会用于取代 ForEach&#xff0c;相较后者具有更强的渲染性能&#xff0c;Repeat 具有两种工作模式&#xff1a; non-virtualScroll 模式 在初始化页面时就加载列表中的全部子组件。 相比于ForEach&#xff0c;具有…

Unity3D 战斗系统架构与设计详解

引言 战斗系统是许多游戏的核心玩法之一&#xff0c;尤其是在动作游戏、角色扮演游戏&#xff08;RPG&#xff09;和策略游戏中。Unity3D 作为一款强大的游戏引擎&#xff0c;提供了丰富的工具和 API 来帮助开发者实现复杂的战斗系统。本文将详细探讨 Unity3D 中战斗系统的架构…