【C++】-const对象及成员函数之类和对象中篇完结(中)

news2024/12/27 14:14:18

💖作者:小树苗渴望变成参天大树
❤️‍🩹作者宣言:认真写好每一篇博客
💨作者gitee:gitee
💞作者专栏:C语言,数据结构初阶,Linux,C++

文章目录

  • 前言
  • 一、案例的引入
  • 二、const对象和成员函数
  • 三、取地址及const取地址操作符重载
  • 四、总结


前言

今天我们来讲讲const对成员对象和成员函数都有那些要注意的细节,还有两个默认成员函数的简单讲解,内容不是特别难,对于const大家要熟悉引用中对于权限的放大,缩小,平移的理解,可以参考这篇引用的第6.5节讲的内容,再来理解这个就好理解一点,那我们开始进入正文的讲解


一、案例的引入

我们其实已经接触过了一点关于const修饰对象的案例了,再讲解输入输出运算符重载的博客中,全局的重载函数访问私有的成员有两种方法,一个使用友元,一个使用共有的成员函数将值返回出来,第二种方法

在这里插入图片描述
我们当时说为什么这个不加const修饰,主要原因是类型的不匹配,对于我们成员函数,我们再类和对象的第一篇博客就讲解到过,每个正常成员函数都有一个隐藏的this指针(有的用static修饰的成员函数就没有this指针,所以这里说正常的成员函数),对于隐藏的this指针他的类型为类名+*+this(以日期类为例:date * this),准确来说,他的类型为(*date const this)修饰的this本身不变修改,当时没说明是怕大家不理解,这里再提出来,对于上图的案例,其实应该写成这样的:
在这里插入图片描述
通过这个图,大家应该差不多明白了为什么上面不加const了吧,大家有了这方面的了解之后,我们再来细看

二、const对象和成员函数

再上面我们如果想传const的对象应该怎么办,this指针本身就是隐藏的,所以没有办法显示的加const,那么祖师爷针对这个问题就规定了再括号后面加一个const,例如:

class Date
{
public:
	Date(int year=1, int month=1, int day=1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << "Print()" << endl;
	}
	void Print() const
	{
		cout << "Print()const" << endl;
	}
private:
	int _year; // 年
	int _month; // 月
	int _day; // 日
};

我们来测试一下:
在这里插入图片描述
我们来看看加const的成员函数能不能调用普通对象:
在这里插入图片描述

因为从Datethis传给const Datethis是权限的缩小,所以可以,反过来就不行,既然这样有的人就像把全部的成员函数都加一个const这样不是更好吗??其实并不是,对于那些不修改对象的成员函数可以加,效果更好,修改自身不可以加

在这里插入图片描述

这个const对象d2无法调用非const的成员函数,原因就是权限的放大了,const对象没有办法传给非const的this

通过上面的案例

  1. const对象不可以调用非const成员函数
  2. 非const对象可以调用const成员函数 **

我们来看看之前写了日期类那些可以加:

class date 
{
public:
	date(int year = 1, int month = 1, int day = 1)//全缺省的构造函数
	{
		if (day > 0 && day <= getmonthday(year, month) && month > 0 && month < 13)
		{
			_year = year;
			_month = month;
			_day = day;
		}
		else
		{
			cout << "非法初始化" << endl;
			assert(false);
		}
	}
	//拷贝构造
	//赋值重载
	//析构函数

	void print()const//当成内联函数
	{
		cout << _year << " " << _month << " " << _day << endl;
	}
	bool operator<(const date& d)const;
	bool operator==(const date& d)const;
	bool operator>(const date& d)const;
	bool operator>=(const date& d)const;
	bool operator<=(const date& d)const;
	bool operator!=(const date& d)const;

	date& operator+=(int day);
	date operator+(int day)const;


	static int getmonthday(int year, int month);

	// 日期-天数
	date operator-(int day)const;
	// 日期-=天数
	date& operator-=(int day);

	// 前置++
	date & operator++();
	// 后置++
	date operator++(int);
	// 后置--
	date operator--(int);
	// 前置--
	date& operator--();

	int operator-(const date& d)const;
	int getyear()const
	{
		return _year;
	}
	int getmonth()const
	{
		return _month;
	}
	int getday()const
	{
		return _day;
	}
	friend ostream& operator<<(ostream& cout, const date& d);
	friend istream& operator>>(istream& cin, date& d);

再定义的地方也要加const

不加会出现那些情况:
在这里插入图片描述
大家看这样就比较不了,原因是小于里面的隐藏this不是const修饰类型,而运算符的第一个参数默认传给this的,第二不行的原因是,d2是const修饰类型,传给的this是普通的类型,是权限的放大,所以不行
在这里插入图片描述
所以必须要在小于那里加const:
在这里插入图片描述
所以有的时候不加还是不行的,根据具体实际来写

  1. 要修改成员变量的函数不能加
  2. 只要成员函数内部不修改成员变量都应该加const,这样const对象和普通对象都可以调用

其实对于单个函数需不需要使用const很好判断的,但是对于函数复用,就很麻烦,我们来看看下面两个问题:(这样自己再理解一下日期类那些函数加const的特性)

  1. const成员函数内可以调用其它的非const成员函数吗?
    在这里插入图片描述

  2. 非const成员函数内可以调用其它的const成员函数吗?
    在这里插入图片描述
    大家应该看到想要的结果了吧,在日期类中,我们的小于和等于是自己实现的,其余的都是复用这两个函数,如果这两个不加const,其余的都不能加,加了就会报错。

在这里插入图片描述
只要复用了小于和等于的函数都需要加const,不然就会报错,所以大家在写日期类的时候要主要了,如果有的函数用的时候保存,大概路是类型传参不匹配,往前面检查就行了。这个在后面也会遇到的,现在大家理解起来还是有点困难的。

三、取地址及const取地址操作符重载

我们在类和对象中篇的时候,讲过我们有六个默认成员函数,之前已经讲过了四个,现在还剩两个,这两个几乎很少需要自己实现,默认生成的就可以完成需求,这两个没啥可以讲的,就是取到对象的地址

class Date
{ 
public :
 Date* operator&()
 {
   return this ;
 }
 const Date* operator&()const
 {
 return this ;
 }
private :
 int _year ; // 年
 int _month ; // 月
 int _day ; // 日
};

在这里插入图片描述
const的取地址运算符就是为了取出const对象的地址,这里面有一个注意的细节,我们的d2对象是const修饰的,所以必须初始化,因为只有一次初始化的机会。我这里直接给缺省值,调用构造函数就行了。

自己手写这个函数,可能不想让别人得到对象的地址,返回一个假的数据给他:
在这里插入图片描述
大家知道了解就好,以后开发几乎不咋需要自己实现

这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容!

四、总结

到这里我们的类和对象中篇算是讲解完了,里面的内容非常的多,尤其是细节方面的,大家一定要理解,画图,接下来我将讲解类和对象下篇的知识点,初始化列表是一个比较难的知识点,大家做好准备,我们下篇再见。

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

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

相关文章

有效库存管理策略:避免滞销和短缺的利器!

在现代企业管理中&#xff0c;采购计划和库存管理是非常重要的环节。一方面&#xff0c;采购计划可以让企业根据市场需求和自身情况&#xff0c;科学合理地安排采购时间、采购量和采购方式&#xff0c;从而有效地控制成本&#xff0c;并确保生产和销售的顺畅&#xff1b;另一方…

bigdata-file-viewer--大数据文件查看工具

bigdata-file-viewer--大数据文件查看工具 bigdata-file-viewer是什么常用功能安装 bigdata-file-viewer是什么 一个跨平台&#xff08;Windows&#xff0c;MAC&#xff0c;Linux&#xff09;桌面应用程序&#xff0c;用于查看常见的大数据二进制格式&#xff0c;例如Parquet&…

【C++ 学习 ③】- 类的六大默认成员函数

目录 一、 构造函数 1.1 - 概念 1.2 - 特性 二、析构函数 2.1 - 概念 2.2 - 特性 2.3 - 用栈实现队列 三、拷贝构造函数 四、运算符重载 4.1 - 双目运算符 4.2 - 单目运算符 4.3 - 赋值运算符重载 五、const 成员函数 六、取地址 和 const 取地址运算符重载 参考…

如何写软件测试简历项目经验,靠这个面试都要赶场

一、前言&#xff1a;浅谈面试 面试是我们进入一个公司的门槛&#xff0c;通过了面试才能进入公司&#xff0c;你的面试结果和你的薪资是息息相关的。那如何才能顺利的通过面试&#xff0c;得到公司的认可呢?面试软件测试要注意哪些问题呢?下面和笔者一起来看看吧。这里分享一…

如何计算旋转框的IOU

一、先将两个框转换为角点形式 一般我们得到的是中心点&#xff0c;宽高&#xff0c;和旋转角度。通过矢量旋转公式得到角点形式。 二、判断四个角点是否在对方的框里&#xff0c;并保存在里面的角点 A的角点向B的相邻的两条边投影(任意的B的两条边)&#xff0c;使用向量点积得…

微信开发者工具实现代码加固

一&#xff1a;下载安装node.js node.js下载地址&#xff1a;下载 | Node.js 二&#xff1a;微信开发者工具安装代码加固拓展 1&#xff1a;开发者工具选择设置-》拓展设置 2:安装代码加固拓展 三&#xff1a;使用代码加固拓展实现核心密码加密 1&#xff1a;安装devtool-cod…

makefile 变量赋值方式

文章目录 前言一、变量的定义和使用二、变量的赋值方式1&#xff0c;简单赋值 &#xff08; : &#xff09;2&#xff0c;递归赋值 &#xff08; &#xff09;3&#xff0c;条件赋值 &#xff08; ? &#xff09;4&#xff0c;追加赋值 &#xff08; &#xff09; 三、预定义…

Django框架003:orm与MySQL数据库的连接及踩坑记录

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

FFCNet:基于傅立叶变换的频率学习和复杂卷积网络用于结肠疾病分类

文章目录 FFCNet: Fourier Transform-Based Frequency Learning and Complex Convolutional Network for Colon Disease Classification摘要方法Patch Shuffling Module (PSM)Frequency-Domain Complex NetworkComplex ConvolutionComplex ReLUComplex BN 实验结果 FFCNet: Fou…

1— .Net MVC之控制器

在上下文中使用的控制器 问题 答案 什么是控制器&#xff1f; 控制器包含用于接收请求、更新应用程序状态或模型以及选择将发送给客户端的响应的逻辑 控制器有什么用&#xff1f; 控制器是MVC项目的核心&#xff0c;并包含Web应用程序的逻辑 如何使用控制器&#xff1f; …

第五讲:设计库的管理和使用

第五讲&#xff1a;设计库的管理和使用 概述&#xff1a; 课程内容简介&#xff1a; 1、 下载Design kit 2、 安装 Design kit 3、 Design kit的使用 4、 如何进行优化设计 Design Kit – 由元件厂商所提供设计元件库&#xff0c; PDK – Process Design Kit &#xff08;IC的…

智能改写工具免费-智能改写工具

中文改写软件 您好&#xff0c;中文改写软件是使用人工智能技术改写中文文本的工具。它可以自动识别并改写文本中的某些词语、短语或句子&#xff0c;以使它们在语意上更为准确、清晰或通顺。 中文改写软件的工作原理基于自然语言处理技术。它使用预先训练好的模型&#xff0…

Windows Server 2016安装Mysql 5.6

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

软考——软件工程,面向对象,数据流图,数据库设计,UML建模,数据结构及算法应用,面向对象程序设计

软件工程 开发模型 瀑布模型 其他模型 增量模型和螺旋模型 V模型 瀑布模型是结构化模型&#xff0c;喷泉模型是面向对象模型 构件组装模型&#xff08;CBSD&#xff09; 统一过程 敏捷开发方法 信息系统开发方法 需求 结构化设计 基本原则 内聚与耦合 软件测试 测试原则与类…

Nmap服务版本探测研究

文件nmap-services 作用&#xff1a;预定义服务和端口映射表&#xff0c;该文件原则上不允许修改 nmap-services未定义33890端口映射&#xff0c;扫描结果&#xff1a; PORT STATE SERVICE REASON 33890/tcp open unknown syn-ack nmap-services定义33890端口映射&#x…

从环形图出发,打造高效数据分析流程

什么是环形图&#xff1f; 环形图是一种数据可视化的图表类型&#xff0c;它通常用于显示数据的比例关系和占比情况。环形图与饼图类似&#xff0c;都是由一个圆形或圆环和若干个扇形组成&#xff0c;每个扇形的面积大小表示该数据所占比例的大小。与饼图不同的是&#xff0c;…

强化学习p4-Actor-Critic

策略网络和价值网络的架构 我们知道状态价值函数 V π ( s ) ∑ a π ( a ∣ s ) ⋅ Q π ( s , a ) V_\pi(s)\sum_a\pi(a|s)\cdot Q_\pi(s,a) Vπ​(s)∑a​π(a∣s)⋅Qπ​(s,a)&#xff0c;在策略学习中&#xff0c;我们用神经网络去近似 π \pi π函数&#xff0c;得到策…

模糊PID(重心法解模糊梯形图FC)

模糊PID的模糊化请参看下面的博客文章: 博途PLC模糊PID三角隶属度函数指令(含Matlab仿真)_plc 模糊pid_RXXW_Dor的博客-CSDN博客三角隶属度函数FC,我们采用兼容C99标准的函数返回值写法,在FB里调用会更加直观,下面给大家具体讲解代码。常规写法的隶属度函数FC可以参看下…

分享一个提高运维效率的 Python 脚本

哈喽大家好我是咸鱼&#xff0c;今天给大家分享一个能够提升运维效率的 python 脚本 咸鱼平常在工作当中通常会接触到下面类似的场景&#xff1a; 容灾切换的时候批量对机器上的配置文件内容进行修改替换对机器批量替换某个文件中的字段 对于 Linux 机器&#xff0c;咸鱼可以…

Fiddler 抓包工具使用 - 手摸手教你

Fiddler简介 Fiddler 是一款免费、灵活、操作简单、功能强大的 HTTP 代理工具&#xff0c;是目前最常用的 HTTP 抓包工具之一。可以抓取所有的 HTTP/HTTPS 包、过滤会话、分析请求详细内容、伪造客户端请求、篡改服务器响应、重定向、网络限速、断点调试等功能。 Fiddler工作…