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.mzph.cn/news/812765.shtml

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

相关文章

卫星遥感影像在农业方面的应用及评价

一、引言 随着科技的进步&#xff0c;卫星遥感技术在农业领域的应用越来越广泛。卫星遥感技术以其宏观、快速、准确的特点&#xff0c;为农业生产和管理提供了有力的技术支撑。本文将对卫星遥感在农业方面的应用进行详细介绍&#xff0c;并通过具体案例进行说明。 二、…

(二)ffmpeg 下载安装以及拉流推流示例

一、ffmpeg下载安装 官网&#xff1a;https://www.ffmpeg.org/ 源码下载地址&#xff1a;https://www.ffmpeg.org/download.html#releases 下载源码压缩包 下载完成之后解压并在该目录下打开命令窗口 安装依赖环境&#xff1a; sudo apt-get install build-essential nasm …

【CAD建模号】学习笔记(二)——工作区

工作区介绍 工作区由[工具提示]&#xff0c;[自适应网格]&#xff0c;[自适应坐标轴]&#xff0c;[参考坐标轴]&#xff0c;[绘制的图形]组成。 一、工具提示 工具提示是提示当前工具的操作步骤&#xff0c;同时也提供了更加精确的参数输入方式建模、绘图时直接生成面&#x…

规则系统架构

规则系统架构 目录概述需求&#xff1a; 设计思路实现思路分析1.规则系统架构2. 规则系统架构优势 性能参数测试&#xff1a; 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,mak…

【MYSQL】其他索引的创建使用方式

MySQL其他索引的创建使用方式 前面的案例中&#xff0c;聊到了咱们有三种方式创建索引&#xff0c;在创建时可通过INDEX、KEY两个关键字创建&#xff0c;但这种方式建立的索引仅是普通索引&#xff0c;接着再来聊一聊MySQL数据库其他类型的索引该如何创建以及使用。 但不管是何…

3D应用模型信创系统实时渲染有什么要求?

实时云渲染技术是数字孪生领域&#xff0c;比较常用的轻量化软件交付方式&#xff0c;该技术是将3D应用等大模型的算力执行放在了服务器端&#xff0c;而服务器目前比较常用的还是Windows系统。但随着国产信创在数字孪生领域应用越来越多&#xff0c;实时云渲染平台的国产信创化…

Games101Homework【6】Acceleration structure(Including framework analysis)

Code Analysis&#xff1a; friend&#xff1a; C中友元&#xff08;友元函数和友元类&#xff09;的用法和功能_friend class a<b>-CSDN博客 [C&#xff1a;不如Coding]&#xff08;11&#xff09;&#xff1a;友元函数与友元类_哔哩哔哩_bilibili Here is a simple…

二维数组---刷题

一维数组不想更了&#xff0c;弄点二维数组&#xff01; 1.对角线 已知一个6*6的矩阵&#xff0c;把矩阵两条对角线上的元素加上10&#xff0c;然后输出这个新矩阵。 思路 题目简单&#xff0c;6*636&#xff0c;可以得知有36个元素。数组就定义成a[7][7]&#xff0c;难点在与…

软考数据库---3.关系数据库

3.1 名词 属性分类 数据库实体属性分类主要包括以下几个方面&#xff1a; 标识属性 (Key Attribute / Identifier): 这些属性是用来唯一识别实体实例的关键属性&#xff0c;也称为主键&#xff08;Primary Key&#xff09;。在数据库表中&#xff0c;每个实体的实例&#xff0…

深入解析实时数仓Doris:介绍、架构剖析、应用场景与数据划分细节

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! Doris是一款高性能、开源的实时分析数据仓库&#xff0c;旨在为用户提供毫秒级查询响应、高并发、高可用以及易于扩展的OLAP解决方…

【深度学习实战(5)】使用OPENCV库实现自己的letter_box操作

一、letter_box 深度学习模型输入图片的尺寸为正方形&#xff0c;而数据集中的图片一般为长方形&#xff0c;粗暴的resize会使得图片失真&#xff0c;采用letterbox可以较好的解决这个问题。该方法可以保持图片的长宽比例&#xff0c;剩下的部分采用灰色填充。 二、代码 本例…

c语言->贪吃蛇实战技巧结合EasyX简单实现页面管理(简单实现)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 1. 游戏背景 贪吃蛇是久负盛名的游戏&#xff0c;它也和俄罗斯⽅…

AndroidAutomotive模块介绍(二)应用及接口介绍

前言 上一篇文章中从整体角度描述了 Android Automotive 模块。本篇文章将对 Android Automotive 中的 APP 以及 API 部分展开描述。 上一篇&#xff1a;AndroidAutomotive模块介绍&#xff08;一&#xff09;整体介绍 下一篇&#xff1a;AndroidAutomotive模块介绍&#xff0…

python-study-day2

pycharm注释(也可修改) 快捷键ctrl /手敲一个 " # " 这个是单行注释""" """ 左边这个三个引号可以完成多行注释 基础知识 常用的数据类型 def hello(self):print("Hello")print(type(1)) print(type("1"…

图片超分辨率重构实战——SRGAN

数据与代码链接见文末 论文地址:Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network https://arxiv.org/abs/1609.04802v4 1.概述 通常来说,分辨率越低,图像越模糊,分辨率越高,图像越清晰,图像超分辨率重构就是将分辨率低的图像重…

OceanBase V4.2 MySQL模式下,如何通过DBLINK实现跨数据源访问

概述 跨数据源访问可通过 DBLINK&#xff08;以下简称DBLINK&#xff09;实现&#xff0c;从而使得业务代码能够像访问本地数据库一样轻松访问远端数据库。原先&#xff0c;DBLINK主要服务于Oracle模式&#xff0c;但由于OceanBase 的MySQL模式租户同样存在访问远端数据库的需…

基于Springboot+Vue的Java项目-旅游网站系统(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

K-means和逻辑回归

逻辑回归 一个事件的几率是该事件发生的概率/该事件不发生的概率&#xff1a;P/&#xff08;1-P&#xff09; 对数几率是&#xff1a;log(P/&#xff08;1-P&#xff09;) **考虑对输入x分类的模型&#xff1a;**log(P/&#xff08;1-P&#xff09;)wx 则 Pexp(wx)/(exp(w*x)…

Ubuntu上安装Python3.11-源码编译

1、下载依赖 sudo apt install -y wget build-essential libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev 2、上传文件 &#xff0c;解压并进入 tar -xf Python-3.11.0.tar.xz 3、编译 cd Pyt…

跟TED演讲学英文:The dark side of competition in AI by Liv Boeree

The dark side of competition in AI Link: https://www.ted.com/talks/liv_boeree_the_dark_side_of_competition_in_ai Speaker:Liv Boeree Date: October 2023 文章目录 The dark side of competition in AIIntroductionVocabularyTranscriptSummary后记 Introduction Co…