深入理解C++中的mutable关键字

2023-10-27

mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。

  在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。

  我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。

  下面是一个小例子:

class ClxTest
{
 public:
  void Output() const;
};

void ClxTest::Output() const
{
 cout << "Output for test!" << endl;
}

void OutputTest(const ClxTest& lx)
{
 lx.Output();
}

  类ClxTest的成员函数Output是用来输出的,不会修改类的状态,所以被声明为const的。

  函数OutputTest也是用来输出的,里面调用了对象lx的Output输出方法,为了防止在函数中调用其他成员函数修改任何成员变量,所以参数也被const修饰。

  如果现在,我们要增添一个功能:计算每个对象的输出次数。如果用来计数的变量是普通的变量的话,那么在const成员函数Output里面是不能修改该变量的值的;而该变量跟对象的状态无关,所以应该为了修改该变量而去掉Output的const属性。这个时候,就该我们的mutable出场了——只要用mutalbe来修饰这个变量,所有问题就迎刃而解了。

  下面是修改过的代码:

class ClxTest
{
 public:
  ClxTest();
  ~ClxTest();

  void Output() const;
  int GetOutputTimes() const;

 private:
  mutable int m_iTimes;
};

ClxTest::ClxTest()
{
 m_iTimes = 0;
}

ClxTest::~ClxTest()
{}

void ClxTest::Output() const
{
 cout << "Output for test!" << endl;
 m_iTimes++;
}

int ClxTest::GetOutputTimes() const
{
 return m_iTimes;
}

void OutputTest(const ClxTest& lx)
{
 cout << lx.GetOutputTimes() << endl;
 lx.Output();
 cout << lx.GetOutputTimes() << endl;
}

  计数器m_iTimes被mutable修饰,那么它就可以突破const的限制,在被const修饰的函数里面也能被修改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解C++中的mutable关键字 的相关文章

  • 是否有与 SQL Server newsequentialid() 等效的 .NET

    我们使用 GUID 作为主键 您知道默认情况下它是集群的 将新行插入表中时 它将插入表中的随机页 因为 GUID 是随机的 这会对性能产生可衡量的影响 因为数据库始终会分割数据页 碎片 但我使用顺序 GUID 的主要原因是因为我希望将新行插
  • lambda 始终返回“1”

    有这样的代码 include
  • 我可以在 WinRT / Windows 8 Store 应用程序中绑定 DynamicObject

    我有以下代码 public class MyClass DynamicObject INotifyPropertyChanged Dictionary
  • 当用户与 DateTimePicker 控件交互时会引发什么事件?

    我是 C 新手 在我的程序中使用 DateTimePicker Value Changed 事件 但我发现当用户单击箭头时发生 ValueChanged 事件 或者如果也以编程方式更改值 我只想识别 DateTimePicker 的用户交互
  • 仅使用 1 行 C++ 初始化 2d 向量

    我需要能够初始化一个 2D 向量 int同一条线我在其中创建它 更具体地说 我必须创建一个3x2大小 2D 向量并将其所有值设置为 0 仅使用1行代码 有没有一种方法可以在不使用 for 循环和几行代码的情况下完成此操作 尝试这个 std
  • 从 proc/pid/cmdline 解析命令行参数

    我正在尝试解析命令行参数另一个程序 这是一个模拟器 在我的程序中使用system 命令和模拟器的pid 不幸的是同时使用文件读取和cat 输出格式不正确 所以我无法真正获取数据 cat在命令行上显示删除了空格的文件内容 整个字符串粘在一起
  • 相当于一个允许重复键的排序字典

    我需要一个数据结构 可以通过与对象关联的浮动键对对象进行排序 从低到低的在前 问题是键代表成本 所以经常有重复 我不关心这一点 因为如果两个具有相同的成本 我只会抓住第一个 因为它没有区别 问题是编译器抱怨 是否有一种数据结构的行为方式相同
  • EntityFramework:“参数值超出范围。”

    我在 EntityFramework 模型优先 中保存小数时遇到问题 在我的 EDMX 中 我声明我的属性为 Decimal 30 10 然后我尝试保存该数字 1215867935736100000 结果是 Parameter value
  • 返回 ObjectResult 会导致 406 Not Acceptable

    在学习 Scott Allen 的 Pluralsight 课程 Asp net Core 1 0 基础知识 时 在 MVC 框架中的控制器 模块和 操作结果 部分中 我在 Index 操作方法上遇到了 406 Not Acceptable
  • 通知另一个线程数据可用的最快方法是什么?有什么替代旋转的方法吗?

    我的一个线程将数据写入循环缓冲区 另一个线程需要尽快处理该数据 我本来想写这么简单的spin 伪代码 while true while a i do nothing just keep checking over and over proc
  • FileStream - “不支持给定路径的格式”

    我正在尝试使用EPPlus http epplus codeplex com 在我们的 LAN 上保存电子表格 我正在使用一个FileStream对象执行此操作 但是每当我尝试实例化该对象时 我都会收到错误 The given path s
  • 自定义文件属性

    我需要遵循 在我的申请中 我有文件 需要随时签入和签出的文件 当我从应用程序中签出文档时 我需要将自定义属性添加到文件中 以便稍后在签入文档时可以识别它 我尝试使用以下代码使用 DSOFile 中的 OleDocumentPropertie
  • 策略模式的现实示例

    我一直在读关于OCP原理 http en wikipedia org wiki Open closed principle以及如何使用策略模式来实现这一目标 我打算尝试向几个人解释这一点 但我能想到的唯一例子是根据 订单 的状态使用不同的验
  • 在 C 中初始化结构体的静态数组

    我正在用 C 实现一个纸牌游戏 纸牌有很多种类型 每种纸牌都有大量信息 包括一些需要单独编写与其关联的脚本的操作 给定这样的结构 并且我不确定我的语法是否适合函数指针 struct CARD int value int cost This
  • 从 WMI 运行 exe 时的网络身份验证

    我有一个 C exe 需要使用 WMI 运行并访问网络共享 但是 当我访问共享时 我收到 UnauthorizedAccessException 如果我直接运行 exe 则可以访问共享 我在这两种情况下都使用相同的用户帐户 我的应用程序有两
  • C/C++ 特殊 CPU 功能的使用

    我很好奇 新的编译器是否使用了新 CPU 中内置的一些额外功能 例如 MMX SSE 3DNow 所以 我的意思是 在最初的 8086 中甚至没有 FPU 所以旧的编译器甚至不能使用它 但新的编译器可以 因为 FPU 是每个新 CPU 的一
  • 在 Qt C++ 中使用多个键

    我正在构建 坦克 游戏 我使用关键事件在地图上运行我的坦克 实际上我当时只能使用一把钥匙 但我需要有能力去完成任务 同时向上和离开 这是我的单键事件代码 switch event gt key case Qt Key Up if ui gt
  • 使用 STL 迭代器而不初始化它

    我想做这样的事情 container iterator it NULL switch eSomeEnum case Container1 it vecContainer1 begin break case Container2 it vec
  • 如果 foreach 是一个结构数组,它会复制每个元素吗?

    我有一个结构数组 做foreach运算符在迭代数组时复制每个元素 据我所理解foreach只是底层的语法糖转换为for 所以看来答案是否定的 但我很想得到一些确认 PS 看来应该有人已经问过了 但我无法轻易找到任何东西 因此 请以提供的参考
  • 如何注销多个非当前用户的会员用户?

    我正在使用属于 MVC2 默认项目一部分的 MembershipProvider 我希望能够获取用户名列表 注销用户 并在需要时销毁他们的会话 我能想到的最接近的是 foreach string userName in UserNames

随机推荐

  • 解决方案:QObject::moveToThread: Current thread (***) is not the object‘s thread

    报错信息 QObject moveToThread Current thread 0x5651ebdaa180 is not the object s thread 0x5651eba7e2a0 Cannot move to target
  • 【npm第6期】通过vue中npm run build --report来介绍npm传参

    最近发现vue中可以通过npm run build report来调用webpack bundle analyzer插件 具体相关代码如下 webpack prod conf js if config build bundleAnalyze
  • [HDLBits] Edgecapture

    For each bit in a 32 bit vector capture when the input signal changes from 1 in one clock cycle to 0 the next Capture me
  • 使用docker报错 :Error response from daemon: Get https://index.docker.io/v1/search?q=java&n=25: dial tcp:

    最近在学习docker时 在安装完成后去搜索镜像资源出了这个问题 开始以为是镜像加速器没配好 就试着重新配置镜像加速器 重装了docker 折腾了一番依然没有解决 具体错误信息 1 2 root localhost docker searc
  • MySQL实现删除重复数据行仅保留一行

    首先创建测试环境 创建数据库表并加入数据 接下来研究如何做到删除重读的数据行并且仅保留第一条id最小的记录 首先需要知道哪一列是重复的 所以首先筛选出重复的列 select email from user group by email ha
  • 数据库创建函数_达梦数据库创建UUID函数

    数据库创建函数 达梦数据库创建UUID函数 接触达梦数据库有一段时间了 整理了一些资料 今天分享一下达梦数据UUID自定义函数 UUID函数定义 很多数据库都有提供UUID函数 可是接触达梦数据库后 发现达梦数据库并没有UUID函数定义 不
  • C#对txt文件进行读写操作

    C 中对txt文件进行读写操作包括两种方式 一种是基于FileInfo类 调用该类的Read方法 但是该方法读出来的数据是byte格式 需要对其进行解码 将相应的字节数转换为字符 而C 中System Text引用就包含的解码的方法 相应代
  • Nginx做代理时X-Forwarded-For信息头的处理

    如今利用nginx做负载均衡的实例已经很多了 针对不同的应用场合 还有很多需要注意的地方 本文要说的就是在通过CDN 后到达nginx做负载均衡时请求头中的X Forwarded For项到底发生了什么变化 下图为简单的web架构图 先来看
  • MySQL笔记——数据库与数据表(内附例子)

    目录 创建数据库 查看数据库 查看所有数据库 查看数据库使用的字符编码 修改数据库 删除数据库 选择 打开 数据库 创建数据表 基础创建 用select查询的结果创建数据表 将表2复制给表1 修改数据表 增加列 修改列 修改字段名称 修改字
  • “字节一年,人间三年!”

    关注后回复 进群 拉你进程序员交流群 大家好 我在网上冲浪的时候看到一个问题 图片 看到这个问题的时候我就想起了在江湖上流传已久的一句话 字节一年 人间三年 然后我看到了这个问题下的一个高赞回答 分享给了我一位曾经在字节工作过接近三年时间的
  • 新系统申请软件著作权详细操作说明

    关于其他问题 请参见之前的文章 1 软件著作权申请时源程序 文档和其他文件的编写说明 本文主要对源程序 文档和其他文件的格式进行说明 2 计算机软件著作权申请表中开发运行环境 技术特点等项目的编写指南 本文主要对申请表中主要功能 技术特点
  • FPGA学习日记(七)HDMI图像数据传输

    一 实现目标 将像素数据通过HDMI传输 在显示器上显示 二 数据流传输 HDMI常采用TMDS传输 上升沿复位 方式 1 通过三个通道分别可传入8位的rgb视频信号 2位的控制信号 4位的音频信号或其他数据信号 其中行场同步信号在blue
  • 小猴coderush优秀奖

    12月20日那个周末非常忙 本来不想让妞参加学而思小猴的code rush 但我自己看了介绍视频后 发现这个竞赛系统很有意思 小猴子想尽办法吃香蕉 我特别看重了这对c 里 循环 的练习 而且整个练习的过程还是很有趣和有成就感的 所以就让妞报
  • 嵌入式系统开发与应用——基于视觉的机器人SLAM入门实践1

    嵌入式系统开发与应用 基于视觉的机器人SLAM入门实践1 一 OpenCV的安装与配置 1 下载OpenCV3 4 1并解压到ubuntu相应目录上 2 下载安装依赖库和编译工具cmake 1 更新ubuntu软件 2 安装cmake 3
  • 使用vue开发,图文页面,实现点击图片可以预览

    在某个有文字 图片 按钮等元素的页面 比如像各种APP的新闻页面 其中 实现用户点击图片可以预览图片 点击其它元素不会预览 使用 vant 的 ImagePreview 组件实现预览图片 实现效果如下图 main js 引入 ImagePr
  • 调制深度(modulation depth)

    调制深度 也叫调制度 modulation depth 指的是调制波的幅度与载波幅度的比值 常用百分数表示 即 p t A m t cos 2 pi f t 则 md peak m t A 或者 md pmax pmin pmax pmin
  • JAVA-企业微信-自建应用H5的应用配置

    用公司下的企业微信账号登录企业微信服务商后台 https open work weixin qq com 在应用管理页面 进入已创建的应用并配置应用主页 接下来 在底部的网页授权及JS SDK 配置可信域名和回调域名 这个怎么校验的 我有篇
  • defaults write 权限修复$ cd ~/Library/Containers/com.apple.mail $ ls ls: cannot open directory '.': Op

    This may be caused by permissions On Mojave Mail is blocked from apps by default In Bash you will see this by default cd
  • 尚硅谷java项目<云尚办公系统>超详细(三)角色管理前端环境搭建

    一 前端框架 1 vue element admin vue element admin是基于element ui 的一套后台管理系统集成方案 功能 https panjiachen github io vue element admin
  • 深入理解C++中的mutable关键字

    mutalbe的中文意思是 可变的 易变的 跟constant 既C 中的const 是反义词 在C 中 mutable也是为了突破const的限制而设置的 被mutable修饰的变量 将永远处于可变的状态 即使在一个const函数中 我们