mutable关键字的作用(c++)

常成员变量、常成员函数与常对象

常成员变量

  • 声明为常成员变量的成员变量,在对象被创建后就不能被修改
  • 常成员变量必须在对象的构造函数初始化列表中赋值,不能在构造函数体中赋值

    初始化列表的执行是在函数体执行之前就执行了的。上面这种写法和下面的写法类似,但下面的写法叫作函数体内赋值

    对于内置类型如int类型的成员变量,使用构造函数初始化列表来初始化和使用赋值语句来初始化其实差别并不大。但是,对于类类型的成员变量,使用初始化列表的方式初始化比使用赋值语句初始化效率更高(因为少调用了一次甚至几次该成员变量相关类的各种特殊成员函数,如构造函数等)
     

    在C++中,对象的构造过程分为两个阶段:初始化阶段和构造函数体执行阶段。在初始化阶段,成员变量被初始化,包括非常成员变量和常成员变量。而构造函数体执行阶段则是在初始化阶段之后,用于执行用户自定义的构造逻辑。

    由于常成员变量必须在对象创建后就不能被修改,所以必须在初始化阶段完成对常成员变量的初始化。而初始化列表提供了在初始化阶段对成员变量进行初始化的机会,因此常成员变量的初始化必须在构造函数初始化列表中完成。

  • 常成员变量的值在对象生命周期内保持不变。

 

常成员函数

  • 声明为常成员函数的成员函数不会修改对象的状态
  • 在常成员函数中,不允许修改非常成员变量,也不允许调用非常成员函数

常对象

  • 声明为常对象的对象在创建后就不能被修改
  • 常对象只能调用常成员函数,不能调用非常成员函数,以确保对象的状态不能改变
  • 常对象的所有成员变量都被视为常成员变量

总结

  • 常成员变量通常用于声明对象的状态中不希望被修改的部分。
  • 常成员函数用于表明该函数不会修改对象的状态,以便于在常对象上调用。
  • 常对象是在声明时使用 const 关键字修饰的对象,它的状态和行为受到限制,只能调用常成员函数,并且不能修改成员变量。

mutable关键字

从上述定义概述中,我们可以知道,常成员函数是不能修改对象内的任何成员变量的值的,但是设计类成员变量的时候,假如确实遇到了需要在const结尾的成员函数中希望修改成员变量值的需求,怎么办呢?

也许有人会说,那就把函数末尾的const去掉,变成一个不以const结尾的成员函数。那这个时候可能面临上面曾提到过的另外一个问题——如果这个成员函数从const变成非const了,那么就不能被const对象调用了

所以,引入了mutable修饰符(关键字)来修饰一个成员变量。一个成员变量一旦被mutable所修饰,就表示这个成员变量永远处于可变状态,即使是在以const结尾的成员函数中。

如下所示,我们定义一段代码

class Human
{
public:Human(){};Human(std::string name):_name(name){};virtual void show(){std::cout<<"this is human!"<<std::endl;}std::string getName() const{return this->_name;}int getAge() const {return _age;}
private:std::string _name;int _age;
};

在上述代码的基础上,我们将一个getAge这个常成员函数修改一下

可以看到,编译器会自动报错,原因是因为在常成员函数中不能修改任何一个成员变量的值,这时如果我们必须要进行修改,就需要将成员变量声明为mutable的,即

mutable int _age;

这样,代码就不会报错,且满足我们的需求了。

完整代码如下:

class Human
{
public:Human(){};Human(std::string name):_name(name){};virtual void show(){std::cout<<"this is human!"<<std::endl;}std::string getName() const{return this->_name;}int getAge() const {return ++_age;}
private:std::string _name;mutable int _age;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/616609.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vmware安装win10及ubuntu

安装win10 新建一个文件夹 选择刚才创建的文件夹 选择需要保存文件的位置&#xff0c;还是选择刚才创建的文件夹 选择自定义硬件 选择下载的win10镜像iso文件,导入后&#xff0c;点击完成即可 接下来就是下一步 没有此电脑&#xff0c;可以点击个性化-》主题-》桌面设置…

编曲知识17:音高修正 节奏修正 压缩器应用 压缩数值算法

34届音高修正 节奏修正 压缩器应用 压缩数值算法独立音乐人训练营基地,七年在线教育编曲系统授课,培养了几千名独立音乐人https://app8epdhy0u9502.pc.xiaoe-tech.com/detail/l_660be2e3e4b023c02af7abbc/4?course_id=course_2XLKtQnQx9GrQHac7OPmHD9tqbv 修音 准备工作 …

Next.js是什么

前言&#xff1a;最近一年都在nextjs浩瀚的海洋中游来游去&#xff0c;在使用过程中算是小有心得&#xff0c;趁着有那么一点点时间温故而知新&#xff0c;总结一波&#xff08;主要中文文档实在太少&#xff0c;它更新的速度又快&#xff0c;很多时候自己翻文档看issue实在头疼…

RISC-V技术变革:一颗芯片,CPU与GPU合二为一

一颗万能的RISC-V芯片: 将CPU和GPU整合到一个核中 X-Silicon 推出创新的 RISC-V 芯片架构,将 CPU、矢量功能和 GPU 加速无缝集成。这种开源混合芯片专为多功能工作负载而设计,包括人工智能,旨在通过高效处理提升性能。 革命性的 CPU/GPU 混合处理器全新的 RISC-V CPU/GPU 混…

OpenAI CEO山姆·奥特曼推广新AI企业服务,直面微软竞争|TodayAI

近期&#xff0c;OpenAI的首席执行官山姆奥特曼在全球多地接待了来自《财富》500强公司的数百名高管&#xff0c;展示了公司最新的人工智能服务。在旧金山、纽约和伦敦的会议上&#xff0c;奥特曼及其团队向企业界领袖展示了OpenAI的企业级产品&#xff0c;并进行了与微软产品的…

【fastapi】搭建第一个fastapi后端项目

本篇文章介绍一下fastapi后端项目的搭建。其实没有什么好说的&#xff0c;按照官方教程来即可&#xff1a;https://fastapi.tiangolo.com/zh/ 安装依赖 这也是我觉得python项目的槽点之一。所有依赖都安装在本地&#xff0c;一旦在别人电脑上编写项目就又要安装一遍。很扯淡。…

我的新书,在西西弗书店上架了!

大家好&#xff0c;我是程序员小灰。今天告诉大家一个好消息&#xff0c;我的新书在西西弗书店上架了&#xff01; 熟悉小灰的朋友都知道&#xff0c;我以前是京东的一名程序员&#xff0c;现在全职投入到IT领域的自媒体创作。在2019年&#xff0c;我出版了人生中的第一本书《漫…

普乐蛙VR航天体验馆设备VR太空飞船VR元宇宙展厅

三天小长假就要来啦&#xff01;五一假期也即将到来。老板们想捉住人流量这个财富密码吗&#xff1f;那快快行动起来&#xff01;开启VR体验项目&#xff0c;假期赚翻天&#xff01;小编亲测&#xff01;&#xff01;这款设备刺激好玩&#xff0c;想必会吸引各位家长小孩、学生…

Android开发:Camera2+MediaRecorder录制视频后上传到阿里云VOD

文章目录 版权声明前言1.Camera1和Camera2的区别2.为什么选择Camera2&#xff1f; 一、应用Camera2MediaPlayer实现拍摄功能引入所需权限构建UI界面的XMLActivity中的代码部分 二、在上述界面录制结束后点击跳转新的界面进行视频播放构建播放界面部分的XMLActivity的代码上述代…

b站江科大stm32笔记(持续更新)

b站江科大stm32笔记&#xff08;持续更新&#xff09; 片上资源/外设引脚定义表启动配置推挽开漏oc/od 门漏极/集电极 电阻的上拉下拉输入捕获输入捕获通道主从触发模式输入捕获基本结构PWMI基本结构PWMPSC ARR CRR输入捕获模式测频率TIM_PrescalerConfig()初始化输入捕获测频法…

在Windows中用命令行编译C项目

在Windows中可以用命令行编译C项目 官方指导文档&#xff1a; 演练&#xff1a;在命令行上编译 C 程序 | Microsoft Learn 在官方文档中可以看到&#xff0c;可以只安装VS的命令行工具集&#xff0c;如下图所示

MQ概览及Kafka详解

文章目录 概览MQ优点MQ缺点常见MQ对比JMS消息模型点对点模式发布订阅模式 kafka基础架构发布订阅工作流程生产者生产者文件存储生产者分区策略生产者数据可靠性保证生产者数据一致性保证生产者ack机制ExactlyOnce生产者发送消息流程 消费者消费者分区分配策略消费者消费数据问题…