当前位置: 首页 > 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://www.lryc.cn/news/541993.html

相关文章:

  • 设计模式| 观察者模式 Observer Pattern详解
  • Git-速查
  • Spring Boot嵌入式服务器深度解析:从配置到调优的全方位指南
  • 深入解析浏览器渲染全流程:从URL输入到页面渲染的底层原理与性能优化(附实战代码)
  • 【网络安全】常见的web攻击
  • MySQL面试学习
  • 一文读懂Docker之Docker Compose
  • escape SQL中用法
  • Cherno C++ P57 Standard array处理静态数组
  • linux学习【7】Sourc Insight 4.0设置+操作
  • JDK、Hadoop下载地址
  • 【小白向超详细】使用 VSCode 远程连接 Linux 服务器详细教程
  • 设计心得——解耦的实现技术
  • 计算机毕业设计SpringBoot+Vue.jst在线文档管理系统(源码+LW文档+PPT+讲解)
  • 在windows下安装windows+Ubuntu16.04双系统(下)
  • 一文讲解Redis为什么读写性能高以及I/O复用相关知识点
  • TPU(Tensor Processing Unit)详解
  • Ubuntu20.04.2安装Vmware tools
  • 检测服务端口是否开放的常用方法
  • muduo源码阅读:socket常见操作及一些补充
  • 虚拟表格实现全解析
  • 使用 Grafana 监控 Spring Boot 应用
  • 使用Socket编写超牛的http服务器和客户端(一)
  • python turtle模块有哪几种命令
  • 【Transformer架构】
  • unity学习50:NavMeshAgent 区域Areas和cost
  • Blender小技巧和注意事项
  • Python常见面试题的详解15
  • 代码审计初探
  • Spring面试题2