const 和 volatile 在实例成员函数的应用
const 和 volatile 的使用范围几乎没有限制
实例成员函数的参数后面可以出现 const 或 volatile,它们都用于修饰函数隐含参数 this 指向的对象
实例函数对象的参数表后面出现 const 说明this 所指向的对象是不能修改的只读对象
但是可以修改this所指向对象的非只读类型的静态数据成员
实例函数成员参数表后出现const , volatile ,const volatile ,如果这些实例函数对象隐含参数this的修饰词不同,则可视为重载函数
调用实例函数成员,编译器会将实参的类型同this的类型匹配,从而调用最适合的实例函数成员
可读/写的普通变量或者对象应该调用参数表后不带 const 或者 volatile的实例函数成员
const对象则应该调用参数表后 带 const 的实例函数成员
volatile对象应该调用参数表后带 volatile 的实例成员函数
注意,如果调用的时候不存在对应的实例函数成员,会报错
我们来看一个例子,这个例子都是匹配的调用对应的函数
#include<iostream>
using namespace std;
class A {int a;const int b;
public:int f() {cout << "f() " << endl;a++;//b++; 不可修改return a;}int f()volatile {cout << "volatile f()" << endl;a++; // 可以修改本类实例成员数据成员 volatile int a//b++;return a;}int f() const volatile {cout << "f() const volatile " << endl;// a++; 也是错误的return a;}int f()const {cout << "f() const " << endl;// a++ ;也是错误的return a;}A(int x) :b(x) {a = x;}
};
A w(3); // 这是一个可写对象
const A x(6); // 这是一个可读对象
volatile A y(6); // 定义易变对象
const volatile A z(8); // 定义可读易变对象
int main() {w.f();x.f();y.f();z.f();
}
最后的结果如下:

我们来分析一下上面的四个函数成员 f(), 这四个函数成员为重载函数,它们的显示参数表没有定义任何形参,但是隐含形参this的类型各不相同,this用于指向当前函数得对象。
我们来深入思考一下,如果没有最完美得匹配,编译器会退而求其次调用次匹配的函数吗?
看下面的代码,我把 fun() const 和 fun() volatile 都注释,看看情况会怎么改变
#include<iostream>
using namespace std;
class A {int a;const int b;
public:int f() {cout << "f() " << endl;a++;//b++; 不可修改return a;}//int f()volatile {// cout << "volatile f()" << endl;// a++; // 可以修改本类实例成员数据成员 volatile int a// //b++;// return a;//}int f() const volatile {cout << "f() const volatile " << endl;// a++; 也是错误的return a;}//int f()const {// cout << "f() const " << endl;// // a++ ;也是错误的// return a;//}A(int x) :b(x) {a = x;}
};
A w(3); // 这是一个可写对象
const A x(6); // 这是一个可读对象
volatile A y(6); // 定义易变对象
const volatile A z(8); // 定义可读易变对象
int main() {w.f();x.f();y.f();z.f();
}
运行结果如下

我们看的出来,const A x(6) 和 volatile A y(6) 由于找不到最合适的匹配函数,都调用了 f() const volatile
我们再来看一个代码,只注释掉 f() const volatile 函数 ,看看如何
#include<iostream>
using namespace std;
class A {int a;const int b;
public:int f() {cout << "f() " << endl;a++;//b++; 不可修改return a;}int f()volatile {cout << "volatile f()" << endl;a++; // 可以修改本类实例成员数据成员 volatile int a//b++;return a;}//int f() const volatile {// cout << "f() const volatile " << endl;// // a++; 也是错误的// return a;//}int f()const {cout << "f() const " << endl;// a++ ;也是错误的return a;}A(int x) :b(x) {a = x;}
};
A w(3); // 这是一个可写对象
const A x(6); // 这是一个可读对象
volatile A y(6); // 定义易变对象
const volatile A z(8); // 定义可读易变对象
int main() {w.f();x.f();y.f();z.f();
}
发现

报错原因

我们在刚刚的基础上再把 f() const 注释调用
#include<iostream>
using namespace std;
class A {int a;const int b;
public:int f() {cout << "f() " << endl;a++;//b++; 不可修改return a;}int f()volatile {cout << "volatile f()" << endl;a++; // 可以修改本类实例成员数据成员 volatile int a//b++;return a;}//int f() const volatile {// cout << "f() const volatile " << endl;// // a++; 也是错误的// return a;//}//int f()const {// cout << "f() const " << endl;// // a++ ;也是错误的// return a;//}A(int x) :b(x) {a = x;}
};
A w(3); // 这是一个可写对象
const A x(6); // 这是一个可读对象
volatile A y(6); // 定义易变对象
const volatile A z(8); // 定义可读易变对象
int main() {w.f();x.f();y.f();z.f();
}
我们来看看报错如何


我们最后进行一个实验,只把 f() 函数注释掉,看看会发生什么
#include<iostream>
using namespace std;
class A {int a;const int b;
public://int f() {// cout << "f() " << endl;// a++;// //b++; 不可修改// return a;//}int f()volatile {cout << "volatile f()" << endl;a++; // 可以修改本类实例成员数据成员 volatile int a//b++;return a;}int f() const volatile {cout << "f() const volatile " << endl;// a++; 也是错误的return a;}int f()const {cout << "f() const " << endl;// a++ ;也是错误的return a;}A(int x) :b(x) {a = x;}
};
A w(3); // 这是一个可写对象
const A x(6); // 这是一个可读对象
volatile A y(6); // 定义易变对象
const volatile A z(8); // 定义可读易变对象
int main() {w.f();x.f();y.f();z.f();
}
发现报错如下

总结一下,总的一个优先级如下:
啥都没有 > const 和 volatile > const volatile
我来解释一下,如果一个对象不含 const 以及 volatile ,那么会优先调用不含const 和 volatile 的函数,如果没有,就去调用 f() const 或者 f() volatile 之一,这里如果两个都存在,编译器不知道调用哪一个,就会报错,如果 f() const 或者 f() volatile 都不存在,才调用f() const volatile
如果对象是 const 类型的也是同样的道理,先去找f() const ,找不到才调用 f() const volatile
且补充一个小点,const 和 volatile 不能出现在构造函数或析构函数的参数表后,因为构造或者析构一个实例对象的时候,对象必须是可以修改的,且必须处于稳定状态(volatile 说明是易变对象)
相关文章:
const 和 volatile 在实例成员函数的应用
const 和 volatile 的使用范围几乎没有限制 实例成员函数的参数后面可以出现 const 或 volatile,它们都用于修饰函数隐含参数 this 指向的对象 实例函数对象的参数表后面出现 const 说明this 所指向的对象是不能修改的只读对象 但是可以修改this所指向对象的非只读类…...
比Nginx测试桩更方便,ShenYu网关的Mock插件
有时候为了方便测试,我们需要模拟 HTTP 外部接口的返回结果。通常情况下,我们可以使用 Nginx 测试桩来实现这个目的。然而,Nginx 的使用门槛较高,可能对一些初级开发和测试人员来说有一定的难度。相比之下,Apache Shen…...
IDEA: 自用主题及字体搭配推荐
文章目录 1. 字体设置推荐2. 主题推荐3. Rainbow Brackets(彩虹括号)4. 设置背景图片 下面是我的 IDEA 主题和字体,它们的搭配效果如下: 1. 字体设置推荐 在使用 IntelliJ IDEA 进行编码和开发时,一个合适的字体设置可以提高你的工作效率和舒…...
Qt中的枚举变量,Q_ENUM,Q_FLAG以及Qt中自定义结构体、枚举型做信号参数传递
Qt中的枚举变量,Q_ENUM,Q_FLAG,Q_NAMESPACE,Q_ENUM_NS,Q_FLAG_NS以及其他 理论基础:一、Q_ENUM二、QMetaEnum三、Q_FLAG四、示例 Chapter1 Qt中的枚举变量,Q_ENUM,Q_FLAG,Q_NAMESPACE,Q_ENUM_NS,Q_FLAG_NS以及其他前言Q_ENUM的使用Q_FLAG的引入解决什么问题…...
【C++】priority_queue仿函数
今天我们来学习C中另一个容器适配器:优先级队列——priority_queue;和C一个重要组件仿函数: 目录 一、priority_queue 1.1 priority_queue是什么 1.2 priority_queue的接口 1.2.1 priority_queue使用举例 二、仿函数 三、关于priority…...
如何驾驭ChatGPT:掌控有效对话!
📢📢📢📣📣📣 哈喽!大家好,我是【一心同学】,一位上进心十足的【后端领域博主】!😜😜😜 ✨【一心同学】的写作风格&#x…...
LeetCode 面试题 16.03. 交点
文章目录 一、题目二、C# 题解 一、题目 给定两条线段(表示为起点 start {X1, Y1} 和终点 end {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值。 要求浮点型误差不超过 10^-6。若有多个交点(…...
【码银送书第九期】《ChatGPT 驱动软件开发:AI 在软件研发全流程中的革新与实践》
计算机技术的发展和互联网的普及,使信息处理和传输变得更加高效,极大地改变了金融、商业、教育、娱乐等领域的运作方式。数据分析、人工智能和云计算等新兴技术,也在不断地影响和改变着各个行业。 如今,我们正在见证人工智能技术的…...
Hadoop3.0大数据处理学习4(案例:数据清洗、数据指标统计、任务脚本封装、Sqoop导出Mysql)
案例需求分析 直播公司每日都会产生海量的直播数据,为了更好地服务主播与用户,提高直播质量与用户粘性,往往会对大量的数据进行分析与统计,从中挖掘商业价值,我们将通过一个实战案例,来使用Hadoop技术来实…...
华为机试题:HJ3 明明的随机数
目录 第一章、算法题1.1)题目描述1.2)解题思路与答案1.3)牛客链接 友情提醒: 先看文章目录,大致了解文章知识点结构,点击文章目录可直接跳转到文章指定位置。 第一章、算法题 1.1)题目描述 题目描述&…...
Python OpenCV将n×n的小图拼接成m×m的大图
Python OpenCV将nn的小图拼接成mm的大图 前言前提条件相关介绍实验环境n \times n的小图拼接成m \times m的大图代码实现 前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多精彩内容,可点击进入Python日常小操作专栏、OpenCV-Python小…...
wkhtmltoimage/wkhtmltopdf 使用实践
1. 介绍 wkhtmltopdf/wkhtmltoimage 用于将简单的html页面转换为pdf或图片; 2.安装 downloads 2.1. mac os 下载64-bit 版本然后按照指示安装, 遇到 untrust developers 时,需要在 Settings -> Privacy 处信任下该安装包。 2.2. debian # 可用…...
Rclone连接Onedrive
一、Rclone介绍 Rclone是一款的命令行工具,支持在不同对象存储、网盘间同步、上传、下载数据。 我们这里连接的onedrive,其他网盘请查看官方文档。 注意: 需要先在Windows下配置好了,然后再将rclone配置文件复制到Linux的rclone配…...
RK356X/RK3588构建Ubuntu20.04根文件系统
文章目录 前言一、官网下载ubuntu-base二、挂载并构建文件系统2.1、配置构建文件系统环境2.2、编写挂载脚本mount.sh并安装相关工具2.3、轻量级的桌面环境 lubuntu-desktop2.4、卸载一些不必要的软件2.5、添加用户2.6 、允许root用户登录桌面2.7、串口自动登录2.8、添加分区释放…...
本地新建项目如何推到码云上去
1.先在码云上建立一个空仓库,正常步骤就行。建立完成有readme.md. 2.然后本地建立项目文件,正常脚手架搭建VUE\REACT等。记得要项目git init一下。 3.本地改好的内容commit 一下。 4.本地文件与远端仓库建立连接。git remote add origin https://gite…...
RSAUtil 前端 JavaScript JSEncrypt 实现 RSA (长文本)加密解密
文章归档:https://www.yuque.com/u27599042/coding_star/cl4dl599pdmtllw1 依赖 import JSEncrypt from ‘jsencrypt’ pnpm i jsencryptimport {stringIsNull} from “/utils/string_utils.js”:https://www.yuque.com/u27599042/coding_star/slncupw…...
uniapp map polygons 区域填充色(fillColor)在ios显示正常,但在安卓手机显示是黑色的,怎么解决?
uniapp map polygons 区域填充色(fillColor)在ios显示正常,但在安卓手机显示是黑色的,怎么解决? <MapPage :longitude"item.centerCoord[0]" :latitude"item.centerCoord[1]":polygons"[{ points: it…...
OSCAR数据库上锁问题如何排查
关键字 oscar lock 问题描述 oscar 数据库上锁问题如何排查 解决问题思路 准备数据 create table lock_test(name varchar(10),age varchar(10));insert into lock_test values(ff,10); insert into lock_test values(yy,20); insert into lock_test values(ll,30);sessio…...
FPGA与人工智能泛谈-01
文章目录 前言一、FPGA(Field Programmable Gate Array)是什么?二、与GPU的对比1.GPU特点2. FPGA的优势三、人工智能实现的基础架构总结前言 人工智能技术的快速发展正从各个方面改变人类的生活、工作及教育等各个方面,其中人工智能算法的演进又是其中的关键一步,其中会涉及…...
【VASP】POTCAR文件
【VASP】POTCAR文件 POTCAR 文件的介绍qvasp 生成POTCARvaspkit 生成POTCAR再来认识一下各种赝势如何区分US、PAW、LDA、GGA、PW91 前言 一、4个常用的输入文件INCAR、POSCAR、POTCAR、KPOINTS INCAR: 计算任务类型是什么?怎么计算? KPOINTS: 包含了倒易…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
