当前位置: 首页 > news >正文

const 和 volatile 在实例成员函数的应用

constvolatile 的使用范围几乎没有限制
实例成员函数的参数后面可以出现 constvolatile,它们都用于修饰函数隐含参数 this 指向的对象
实例函数对象的参数表后面出现 const 说明this 所指向的对象是不能修改的只读对象
但是可以修改this所指向对象的非只读类型的静态数据成员
实例函数成员参数表后出现constvolatileconst 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();
}

发现报错如下
在这里插入图片描述


总结一下,总的一个优先级如下:
啥都没有 > constvolatile > const volatile
我来解释一下,如果一个对象不含 const 以及 volatile ,那么会优先调用不含constvolatile 的函数,如果没有,就去调用 f() const 或者 f() volatile 之一,这里如果两个都存在,编译器不知道调用哪一个,就会报错,如果 f() const 或者 f() volatile 都不存在,才调用f() const volatile
如果对象是 const 类型的也是同样的道理,先去找f() const ,找不到才调用 f() const volatile

且补充一个小点,constvolatile 不能出现在构造函数或析构函数的参数表后,因为构造或者析构一个实例对象的时候,对象必须是可以修改的,且必须处于稳定状态(volatile 说明是易变对象)

相关文章:

const 和 volatile 在实例成员函数的应用

const 和 volatile 的使用范围几乎没有限制 实例成员函数的参数后面可以出现 const 或 volatile&#xff0c;它们都用于修饰函数隐含参数 this 指向的对象 实例函数对象的参数表后面出现 const 说明this 所指向的对象是不能修改的只读对象 但是可以修改this所指向对象的非只读类…...

比Nginx测试桩更方便,ShenYu网关的Mock插件

有时候为了方便测试&#xff0c;我们需要模拟 HTTP 外部接口的返回结果。通常情况下&#xff0c;我们可以使用 Nginx 测试桩来实现这个目的。然而&#xff0c;Nginx 的使用门槛较高&#xff0c;可能对一些初级开发和测试人员来说有一定的难度。相比之下&#xff0c;Apache Shen…...

IDEA: 自用主题及字体搭配推荐

文章目录 1. 字体设置推荐2. 主题推荐3. Rainbow Brackets(彩虹括号)4. 设置背景图片 下面是我的 IDEA 主题和字体&#xff0c;它们的搭配效果如下&#xff1a; 1. 字体设置推荐 在使用 IntelliJ IDEA 进行编码和开发时&#xff0c;一个合适的字体设置可以提高你的工作效率和舒…...

Qt中的枚举变量,Q_ENUM,Q_FLAG以及Qt中自定义结构体、枚举型做信号参数传递

Qt中的枚举变量,Q_ENUM,Q_FLAG,Q_NAMESPACE,Q_ENUM_NS,Q_FLAG_NS以及其他 理论基础&#xff1a;一、Q_ENUM二、QMetaEnum三、Q_FLAG四、示例 Chapter1 Qt中的枚举变量,Q_ENUM,Q_FLAG,Q_NAMESPACE,Q_ENUM_NS,Q_FLAG_NS以及其他前言Q_ENUM的使用Q_FLAG的引入解决什么问题&#xf…...

【C++】priority_queue仿函数

今天我们来学习C中另一个容器适配器&#xff1a;优先级队列——priority_queue&#xff1b;和C一个重要组件仿函数&#xff1a; 目录 一、priority_queue 1.1 priority_queue是什么 1.2 priority_queue的接口 1.2.1 priority_queue使用举例 二、仿函数 三、关于priority…...

如何驾驭ChatGPT:掌控有效对话!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【一心同学】&#xff0c;一位上进心十足的【后端领域博主】&#xff01;&#x1f61c;&#x1f61c;&#x1f61c; ✨【一心同学】的写作风格&#x…...

LeetCode 面试题 16.03. 交点

文章目录 一、题目二、C# 题解 一、题目 给定两条线段&#xff08;表示为起点 start {X1, Y1} 和终点 end {X2, Y2}&#xff09;&#xff0c;如果它们有交点&#xff0c;请计算其交点&#xff0c;没有交点则返回空值。 要求浮点型误差不超过 10^-6。若有多个交点&#xff08;…...

【码银送书第九期】《ChatGPT 驱动软件开发:AI 在软件研发全流程中的革新与实践》

计算机技术的发展和互联网的普及&#xff0c;使信息处理和传输变得更加高效&#xff0c;极大地改变了金融、商业、教育、娱乐等领域的运作方式。数据分析、人工智能和云计算等新兴技术&#xff0c;也在不断地影响和改变着各个行业。 如今&#xff0c;我们正在见证人工智能技术的…...

Hadoop3.0大数据处理学习4(案例:数据清洗、数据指标统计、任务脚本封装、Sqoop导出Mysql)

案例需求分析 直播公司每日都会产生海量的直播数据&#xff0c;为了更好地服务主播与用户&#xff0c;提高直播质量与用户粘性&#xff0c;往往会对大量的数据进行分析与统计&#xff0c;从中挖掘商业价值&#xff0c;我们将通过一个实战案例&#xff0c;来使用Hadoop技术来实…...

华为机试题:HJ3 明明的随机数

目录 第一章、算法题1.1&#xff09;题目描述1.2&#xff09;解题思路与答案1.3&#xff09;牛客链接 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、算法题 1.1&#xff09;题目描述 题目描述&…...

Python OpenCV将n×n的小图拼接成m×m的大图

Python OpenCV将nn的小图拼接成mm的大图 前言前提条件相关介绍实验环境n \times n的小图拼接成m \times m的大图代码实现 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、OpenCV-Python小…...

wkhtmltoimage/wkhtmltopdf 使用实践

1. 介绍 wkhtmltopdf/wkhtmltoimage 用于将简单的html页面转换为pdf或图片&#xff1b; 2.安装 downloads 2.1. mac os 下载64-bit 版本然后按照指示安装, 遇到 untrust developers 时&#xff0c;需要在 Settings -> Privacy 处信任下该安装包。 2.2. debian # 可用…...

Rclone连接Onedrive

一、Rclone介绍 Rclone是一款的命令行工具&#xff0c;支持在不同对象存储、网盘间同步、上传、下载数据。 我们这里连接的onedrive&#xff0c;其他网盘请查看官方文档。 注意&#xff1a; 需要先在Windows下配置好了&#xff0c;然后再将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.先在码云上建立一个空仓库&#xff0c;正常步骤就行。建立完成有readme.md. 2.然后本地建立项目文件&#xff0c;正常脚手架搭建VUE\REACT等。记得要项目git init一下。 3.本地改好的内容commit 一下。 4.本地文件与远端仓库建立连接。git remote add origin https://gite…...

RSAUtil 前端 JavaScript JSEncrypt 实现 RSA (长文本)加密解密

文章归档&#xff1a;https://www.yuque.com/u27599042/coding_star/cl4dl599pdmtllw1 依赖 import JSEncrypt from ‘jsencrypt’ pnpm i jsencryptimport {stringIsNull} from “/utils/string_utils.js”&#xff1a;https://www.yuque.com/u27599042/coding_star/slncupw…...

uniapp map polygons 区域填充色(fillColor)在ios显示正常,但在安卓手机显示是黑色的,怎么解决?

uniapp map polygons 区域填充色&#xff08;fillColor&#xff09;在ios显示正常&#xff0c;但在安卓手机显示是黑色的,怎么解决&#xff1f; <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: 计算任务类型是什么&#xff1f;怎么计算&#xff1f; KPOINTS: 包含了倒易…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 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 #&#xff1a…...