【C++ 基础篇:22】:类的 const 对象 与 const 成员函数/方法 以及 类中涉及 const 的常见问题!

news2024/11/25 18:48:33

本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下:

  1. 基础篇类与对象(涉及C++的三大特性等);
  2. STL 篇学习使用 C++ 提供的 STL 相关库
  3. 高阶数据结构与算法篇手动实现自己的 STL 库设计实现高阶数据结构,如 B树、B+树、红黑树等。

学习集:

  • C++ 入门到入土!!!学习合集
  • Linux 从命令到网络再到内核!学习合集

本期内容:【C++ 基础篇:22】:类的 const 成员变量/属性 与 const 成员函数/方法 以及 类中涉及 const 的常见问题!


目录:
1. const 成员函数的基本认识
2. 代码示例探讨问题:类的 const 对象
- - 2.1 直接表述式分析
- - 2.2 结合代码式分析
3. const 成员函数的写法!
- - 3.1 基本写法框架
- - 3.2 错误代码示例修改并测试结果
4. 类中涉及 const 的常见问题!
5. 相关文章推荐


【 C++学习合集链接 】


1. const 成员函数的基本认识

  • 将 const 修饰的“成员函数”称之为 const 成员函数!

  • const 修饰类成员函数,实际修饰该成员函数隐含的 this 指针,表明在该成员函数中不能对类的任何成员进行修改。(如何理解请看第二点分析,及第三点的实际使用)

注:此处涉及了之前内容中提及的类中 *this 问题:相关文章点击直达


2. 代码示例探讨问题!

在阅读代码中请记住 const 修饰成员函数的意义:实际修饰该成员函数隐含的 this 指针,表明在该成员函数中不能对类的任何成员进行修改。


提问:如下代码是是否能正常运行通过?【分析讨论看代码后文字内容】

#include<iostream>
using std::cout;
using std::endl;

class Date {
public:
	Date(int year = 2000, int month = 1, int day = 1) {
		_year = year;
		_month = month;
		_day = day;
	}
	void Print() {
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main() {
	// 此前学习的基本示例化方式
	Date d1(2023, 5, 23);

	// 使用 const 修饰实例化对象!
	const Date d2(2023, 5, 24);
	d1.Print();
	d2.Print();

	return 0;
}

运行结果:

在这里插入图片描述


2.1 直接表述式分析

由图可知:程序报错!如上代码中,在实例化示例中使用了 const 修饰!回顾此前对类的介绍中提及过:类是通过 「*this 指针」 实现对不同实例对象的辨别的! 而我们提及的 「*this 指针」 是作为类中的成员函数的第一个(隐藏)参数!其形式为:typename* const this

/* 以构造函数为例 */
void Date( Date* const this, int year, int month, int day){]

显然,从报错中我们可知,实际上我们的使用的 d2 对象是具有 const 修饰的!也就是说我们的标识 d2 的 「*this 指针」 也应该使用 const 修饰!但是回顾此前对 「*this 指针」 介绍时提及过,我们不能对这个隐藏默认参数进行显示传递与接收!那我们该怎么解决这个问题呢?


解决方式:根据前文介绍:const 成员函数的作用是?


2.2 结合代码式分析

首先注意到实例化的两个对象!(字面区别就是有无 const 修饰!)

// 使用 引用与指针的权限思路理解
Date d1(2023, 5, 23);			// 可读可写
const Date d2(2023, 5, 24);		// 只可读

注意到 Print() 函数:注意参数类型!!!

// 函数字面声明的原型如下:
void Print() {}
// 实际中编译器会翻译作:
void Print(Date* const this){}	

/* 
	简而言之,就是隐藏了 this 指针!
	且 this 指针是被 const 修饰(注意 const 在 * 之后的意义!!!)!
*/

回顾两个实例化对象本身:

// 字面形式
Date d1(2023, 5, 23);			
const Date d2(2023, 5, 24);	

// 编译器翻译的形式:
Date d1(&d1, 2023, 5, 23);			
const Date d2(&d2, 2023, 5, 24);	

/*
	注意:
		&d1、&d2 是什么类型?
*/

执行以下语句并获取结果!

/* 执行以下语句: */
cout << typeid(&d1).name() << endl;
cout << typeid(&d2).name() << endl;
/* 结果: */
class Date *
class Date const *

在这里插入图片描述


结合上述结果及函数的参数类型可看出问题!

/*
	&d1:Date *
	&d2:Date const *
	函数参数:Date * 【 const 只是修饰指针的! 】
	从权限角度看来,函数接收的是可读可写参数,传递过来的是只读!在函数内使用时就是权限放大(不可行!只能平行或缩小!)
	
	由此:得出问题的关键就是在于参数问题!
	由此前知识点可知:类的默认隐含参数是不可以显示接收及传递的!那该如何使 Date * => Date const *
	解决方案:const 成员函数【 const 修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。 】
*/

3. const 成员函数的写法!

3.1 基本写法框架

基本写法如下:

type function_name() const	/* 注意 const 的位置及作用 */
{
    
}

3.2 错误代码示例修改并测试结果

对 Print() 函数进行修改!

void Print() const	/* 注意此处修改! */
{
	cout << _year << "-" << _month << "-" << _day << endl;
}

在这里插入图片描述


4. 类中涉及 const 的常见问题!

  1. const 对象可以调用非 const 成员函数吗?
  2. 非 const 对象可以调用 const 成员函数吗?
  3. const 成员函数内可以调用其它的非 const 成员函数吗?
  4. 非 const 成员函数内可以调用其它的 const 成员函数吗?
  5. 同名函数有无 const 修饰是否构成重载?

提示:实践是检验真理的唯一标准!


5. 相关文章推荐

1. C++ 学习 ::【基础篇:11】:C++ 类的基本使用与非静态 this 指针(两个面试考点):类的空指针问题(this指针可以为空吗?) | this指针存在哪里?

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

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

相关文章

基于html+css的图展示111

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

软件测试基础教程学习2

文章目录 软件测试基础2.1 软件测试模型2.2 确认和验证2.3 软件测试分类2.4软件测试流程概述 软件测试基础 2.1 软件测试模型 2.2 确认和验证 软件确认&#xff08;Validation&#xff09;和验证&#xff08;Verification&#xff09;&#xff0c;简称V&V或V2。 确认是指…

python基于yolov7开发构建手写甲骨文检测识别系统

在我之前的文章中&#xff0c;关于手写文字、手写数字、手写字母的检测识别相关的项目都有了不少的实践了&#xff0c;这里就不在赘述了&#xff0c;感兴趣的话可以自行移步阅读即可。 《基于轻量级目标检测模型实现手写汉字检测识别计数》 《python开发构建基于机器学习模型…

Nginx+Tomcat(多实例)实现动静分离和负载均衡四层、七层(总有些惊奇的际遇,比方说当我遇见你)

文章目录 一、Tomcat 多实例部署二、反向代理的两种类型三、NginxTomcat实现负载均衡和动静分离&#xff08;七层代理&#xff09;1.动静分离和负载均衡原理2.实现方法3.部署实例&#xff08;1&#xff09;部署Nginx负载均衡服务器&#xff08;2&#xff09;配置Tomcat多实例服…

【SpringCloud——Sentinel】

一、什么是雪崩&#xff1f; 微服务调用链路中的某个服务发生故障&#xff0c;引起整个链路中的所有微服务都不可用&#xff0c;这就是雪崩。 二、解决雪崩问题的常见措施 1、超时处理 设定超时时间&#xff0c;请求超过一定时间没有响应就返回错误信息&#xff0c;不会无休…

vue 3 第三十三章:自定义 hooks

文章目录 1. vue 2 中mixins1.1. mixins 的缺点&#xff1a; 2. 自定义 hooks2.1. 创建自定义Hook2.2. 在组件中使用自定义Hook 2. 总结 1. vue 2 中mixins 在Vue.js 2.x版本中&#xff0c; mixin 被广泛用于将组件的逻辑、计算属性和方法复用到其他组件中。然而&#xff0c;使…

华为OD机试真题 Java 实现【明明的随机数】【2023Q1 100分】,附详细解题思路

一、题目描述 明明生成了NN个1到500之间的随机整数。请你删去其中重复的数字&#xff0c;即相同的数字只保留一个&#xff0c;把其余相同的数去掉&#xff0c;然后再把这些数从小到大排序&#xff0c;按照排好的顺序输出。 数据范围&#xff1a; 1≤n≤1000 &#xff0c;输入…

springboot+vue游戏项目销售发行系统设计与实现

本游戏销售平台管理员功能有个人中心&#xff0c;用户管理&#xff0c;厂商管理&#xff0c;游戏类型管理&#xff0c;游戏信息管理&#xff0c;众筹项目管理&#xff0c;项目投资管理&#xff0c;论坛管理&#xff0c;管理员管理&#xff0c;系统管理等。厂商发布游戏&#xf…

我在公司彻夜加班,老板居然做出这种事.....

讲道理&#xff0c;我的学历远达不到BAT等名企大厂的要求&#xff0c;去不了好公司我认了&#xff0c;大专毕业的我在找工作的时候发现留给自己的机会并不多&#xff0c;最后去了一家不知名的小公司。入职后才发现这家公司其实就是个外包公司&#xff0c;里面的业务部门和制度相…

使用Mybatis接口开发

文章目录 目录 前言 公司项目用到了mybatis开发接口,虽然很简单,但是mybatis不是特别熟悉,这里学习一下 一、Mybatis接口绑定的两种方式 1.接口绑定实现方式 就是在接口的方法上加上Select,updateInsertDelete等注解 select注解介绍: 简便,能快速去操作sql,它只需要在mapper…

AIGC浪潮来袭,奇点云“数智科技大会”洞见AI加速的数智未来

“进化&#xff0c;发生在每一个数字化场景。” 5月25日&#xff0c;以“数据进化论”为主题&#xff0c;由StartDT&#xff08;奇点云、GrowingIO&#xff09;主办的2023 StartDT Day数智科技大会在杭召开。企业客户、行业专家、技术专家与数万位参会伙伴相聚云上&#xff0c;…

【Linux】shell脚本教程

目录 一、shell历史 二、执行脚本 三、基本语法 3.1变量 3.1.1变量的分类 3.1.2删除变量 3.2文件名代换&#xff08;Globbing&#xff09; 3.3命令代换 3.4算术代换 3.5转义字符 3.6单引号 3.7双引号 四、Shell脚本语法 4.1条件测试 4.2分支 4.2.1if/then/elif…

【SLAM】Kimera-Multi (IEEE-TRO2022 年最佳论文傅京孙)

Kimera-Multi: Robust, Distributed, Dense Metric-Semantic SLAM for Multi-Robot Systems 0 摘要1. 引言2. RELATED WORK3. SYSTEM OVERVIEW4. DISTRIBUTED LOOP CLOSURE DETECTION[4.X Kimera-Multi相关补充](https://github.com/DEARsunshine/Kimera)5. EXPERIMENTS6. CONC…

推箱子-第14届蓝桥杯国赛Scratch真题初中级组第3题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第145讲。 推箱子&#xff0c;本题是2023年5月28日上午举行的第14届蓝桥杯国赛Scratch图形化编程初中级组真题第3题&am…

苹果iOS证书制作教程

众所周知&#xff0c;如果你需要上架苹果APP就必须要苹果iOS证书进行APP签名&#xff0c;否则苹果手机将无法安装你开发的APP&#xff0c;废话不多说&#xff0c;直接上教程。 第一步&#xff0c;注册账号 准备appleid必须开通双重认证&#xff0c;如果注册个人开发者直接下载d…

深度学习基础知识-tf.keras实例: 加州房价预测

参考书籍&#xff1a;《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition (Aurelien Geron [Gron, Aurlien])》 代码有修改&#xff0c;已测通。 简单顺序结构 这次得数据集比之前得简单&#xff0c;只包含数字型特征&#xff0c;没有ocean…

leetcode98. 验证二叉搜索树(java)

验证二叉搜索树 leetcode98. 验证二叉搜索树题目描述 递归法解题思路代码演示 中序遍历解法解题思路代码演示 二叉树专题 leetcode98. 验证二叉搜索树 leetcode 98.验证二叉搜索树 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/…

Linux开发中的辅助工具

文章目录 前言一、add2line二、strip三、ar四、nm五、objdump六、size七、strings总结 前言 本篇文章我们来介绍一些Linux开发中的辅助工具&#xff0c;有了这些辅助工具将会让我们的开发变的更加轻松。 一、add2line addr2line是一个GNU调试工具&#xff0c;用于将程序计数…

priority_queue的模拟实现和仿函数

priority_queue模拟 首先查看源代码&#xff0c;源代码就在queue剩下的部分中 push_heap是STL库中的堆算法&#xff0c;STL库中包装有支持堆的算法&#xff0c;在algorithm.h中&#xff1a; 只要不断用堆的形式插入数据&#xff0c;就会形成堆。 priority_queue模拟——初版 pr…

自定义组件中,使用onLoad,onShow生命周期失效问题

的解决方法 自定义组件中&#xff0c;使用onLoad,onShow生命周期失效问题 自定义组件中&#xff0c;使用onLoad,onShow生命周期失效问题 官方文档可查阅到&#xff1a; 页面生命周期仅在page中的vue页面有效&#xff0c;而单独封装的组件中【页面周期无效】&#xff0c;但是Vu…