C++之善用const修饰成员函数

C++之善用const修饰成员函数

文章目录

  • C++之善用const修饰成员函数
    • 前言
    • 1. 约束函数对成员变量的修改
    • 2. 允许 const 对象调用
    • 3. 在重载函数中提供重载决策
    • 总结

前言

​ 在C++编程中,使用const修饰成员函数是一种非常重要的技术手段,它能够提高代码的可维护性、可读性,并且有助于编译器进行更好的优化。下面将介绍一些在类中善用const修饰成员函数的案例,以及相应的代码示例。请尤其注意第二点和第三点在实际编程中的应用。


1. 约束函数对成员变量的修改

​ 通过在成员函数后面添加const关键字,我们可以约束该函数不能修改类的成员变量。这样一来,我们就能够清晰地表明哪些函数是用来修改对象状态的,哪些函数是用来访问对象状态的。

class A
{
public:
	A(int val = 10):m_val(val)
	{

	}

	// 成员函数修改了成员变量,不能声明为const
	void setVal(int val)
	{
		m_val = val;
	}

	// 成员函数不修改成员变量,应该声明为const
	int getVal() const
	{
		return m_val;
	}
private:
	int m_val;
};
void test1()
{
	A a1;
	cout << a1.getVal() << endl;
}

运行结果:
在这里插入图片描述

2. 允许 const 对象调用

当一个对象被声明为const时,只能调用它的const成员函数。如果类中没有明确标记为const的成员函数,那么 const 对象 将无法调用任何成员函数,因为编译器无法保证这些函数不会修改对象的状态。const 对象调用非 const 成员函数,本质上属于一种权限的放大

class A
{
public:
	// ...
	int getVal()	// 注意这里没有const修饰成员函数
	{
		return m_val;
	}
private:
	int m_val;
};
void test1()
{
	A a1;
	cout << a1.getVal() << endl;

	const A a2;
	cout << a2.getVal() << endl;
}

编译报错:

在这里插入图片描述

在这里插入图片描述

同时我们不难发现,a1 对象(非const对象)可以调用const成员函数,因为这属于权限的缩小

3. 在重载函数中提供重载决策

如果一个成员函数被声明为const,那么它与同名但没有被声明为const的函数构成重载。这样一来,根据对象的 const 属性,可以决定调用哪个版本的函数,提供更好的灵活性。

class B
{
public:
	B(int val = 10) :m_val(val)
	{

	}

	// getVal 函数的两个重载版本
	int getVal() const
	{
		cout << "Const function!" << endl;
		return m_val;
	}
	int getVal()
	{
		cout << "Non-const function!" << endl;
		return m_val;
	}
private:
	int m_val;
};
void test2()
{
	B b1;
	const B b2;

	b1.getVal();
	b2.getVal();
}

运行结果:

在这里插入图片描述


总结

​ 通过善用const修饰成员函数,我们能够在C++代码中提高代码的可维护性、可读性,并且更好地支持类的设计和重载。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Object中的hashCode()

让hashcode方法的返回值为地址 vm参数中输入-XX:UnlockExperimentalVMOptions -XX:hashCode4&#xff0c;如下图&#xff1a; 参考 搞懂JAVAObject中的hashCode()_java_脚本之家 JDK核心JAVA源码解析(9) - hashcode 方法 - 知乎

【k8s】-- 查询 pod 磁盘容量

命令&#xff1a;kubectl get pvc -n 你的namespace --context上下文命名 -o wide 举例&#xff1a;kubectl get pvc -n my-bigdata --contextprod-6 -o wide

10分钟快速开始SkyWalking结合Springboot项目

10分钟快速开始SkyWalking结合Springboot项目 实习期间&#xff0c;公司让我去学习一下链路追踪如何集成到Springboot项目中。 为此有两个方案&#xff1a; 1.opentelementryjaegerprometheus opentelementry 收集器收集线上的metrics和traces&#xff0c;然后发送给jaeger和p…

水资源费征收管理系统V1.1

水资源费征收管理系统 Water Resource Fee Collection And Management System 水资源费征收管理系统 Water Resource Fee Collection And Management System

MS2402隔离Σ-Δ调制器

产品简述 MS2402 是一款二阶 Σ-Δ 调制器&#xff0c;集成片上数字隔离器&#xff0c;能将模 拟输入信号转换为高速 1 位码流。调制器对输入信号连续采样&#xff0c;无 需外部采样保持电路。模拟信号输入满量程为 320mV &#xff0c;转换后的 数字码流的最高数据速率为 1…

js 常见报错 | js 获取数据类型 | js 判断是否是数组

文章目录 js 常见报错1.1 SyntaxError&#xff08;语法错误&#xff09;1.2 ReferenceError&#xff08;引用错误&#xff09;1.3 RangeError&#xff08;范围错误&#xff09;1.4 TypeError&#xff08;类型错误&#xff09;1.5 URLError&#xff08;URL错误&#xff09;1.6 手…

如何用二维码高效收集信息?表单功能轻松实现

表单作为草料二维码的高级功能之一&#xff0c;可用于收集格式统一的数据。你可以通过组合姓名、图片、检查项等组件搭建出电子表单&#xff0c;关联到二维码中&#xff0c;扫码填写表单即可更快速、规范的收集数据。 下面为大家介绍下表单的制作教程。 1、新建表单 新建表单…

跨区域复制建筑UI输入框脚本迷你世界

--复制区域文件 --设置坐标起点&#xff0c;终点 --创建区域 --获取坐标id,data --星空露珠工作室制作 local pos1{x-16,y7,z28} local pos2{x28,y44,z-9} local block{num0} local str{} local str0{} local num0 local count0 local ui6 --几个输入框 local romath.random(…

辽宁博学优晨教育视频剪辑培训探索学习新意义

在当今数字化快速发展的时代&#xff0c;视频已成为信息传达的重要载体。辽宁博学优晨教育视频剪辑培训应运而生&#xff0c;不仅为学员提供了专业的学习平台&#xff0c;更在探索学习的意义方面赋予了新的内涵。 视频剪辑作为现代媒体行业的重要技能&#xff0c;其学习意义不仅…

武汉建筑安全员ABC小题库不存在未雨绸缪“时间够”

武汉建筑安全员ABC小题库不存在未雨绸缪“时间够” 关于武汉三类人员&#xff08;安全员ABC&#xff09;考试小题库&#xff0c;一般都是考试时间出来&#xff0c;准考证下来了&#xff0c;匹配题库&#xff0c;好好看题&#xff08;认真练习即可&#xff09;&#xff0c;一般…

如何在Linux搭建MinIO服务并实现无公网ip远程访问内网管理界面

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…

微信小程序(四十五)登入界面-简易版

注释很详细&#xff0c;直接上代码 上一篇 此文使用了vant组件库&#xff0c;没有安装配置的可以参考此篇vant组件的安装与配置 新增内容&#xff1a; 1.基础组件的组合 2.验证码倒计时的逻辑处理 源码&#xff1a; app.json {"usingComponents": {"van-field…

数据结构知识点总结-绪论 数据结构基本术语 算法及评价

要求 &#xff08;1&#xff09;对数据结构这么课学了哪些知识有个清楚的认知&#xff1b; &#xff08;2&#xff09;掌握目录结构&#xff0c;能复述出来每个知识点下都有哪些内容。 如下图所示&#xff0c;可自行制作思维导图&#xff0c;针对自己薄弱的地方进行复习。 …

签三方协议?大家一定要注意的问题!

签三方协议&#xff1f;大家一定要注意的问题&#xff01; 一、三方协议是什么&#xff1f;二、签三方协议要注意什么&#xff1f;1、待遇问题2、发展机会3、违约金 三、三方协议的一些疑问&#xff1f;1、三方协议和劳动合同的区别&#xff1f;2、签了三方会失去应届生身份嘛&…

Bentley全球COO康岷思:中国市场特别且重要

吴付标 疫情之后&#xff0c;中国再次敞开国门&#xff0c;欢迎四海友人。Bentley全球首席运营官康岷思正是其中的一位。 康岷思三年前加入Bentley管理团队。笔者在2023年10月份在新加坡召开的纵览基础设施大会暨光辉大奖盛典上第一次见到他。中国基础设施数字化先锋们所讲述的…

Vue:基本命令的使用(代码 + 效果)

文章目录 Hello Vue!el: 挂载点datamethods vue命令v-textv-htmlv-on v-showv-ifv-bindv-forv-model Hello Vue! <!DOCTYPE html> <html><head><title>Hello Vue!</title></head><body><div id"app">{{ message }}…

RabbitMq:RabbitMq消息中的相关处理 ③

一、解耦思想 在 RabbitMQ 在设计的时候&#xff0c;特意让生产者和消费者分离&#xff0c;也就是消息的发布和消息的消费之间是解耦的。 生产者与消费者之间的直连&#xff0c;少了很多的灵活性和策略的制定。还有一种解耦的思想存在。 二、消息的可靠性保证与性能关系 消息的…

Nacos简易示例

目录 步骤&#xff1a; 1. 下载并启动 Nacos Server 2. 创建用户订单微服务 2.1 创建 Spring Boot 项目 2.2 添加依赖 2.3 配置 Nacos 2.4 编写业务逻辑 3. 注册服务到 Nacos 4. 测试服务 Nacos 是一个开源的服务发现和配置管理系统&#xff0c;可以用于微服务架构中的…

QT数据库

八、数据库 准备工作 Qt本身并没有数据库功能&#xff0c;但是Qt支持调用其他主流的数据库产品。并且这些数据库产品指定了统一的Qt接口&#xff0c;实际上是一种数据库的中间件。 Qt支持以下数据库类型&#xff1a; 嵌入式常用的数据库式SQLite3&#xff0c;本体只有几兆大小&…