C++初阶 类和对象(下)

news2024/11/29 6:36:13

目录

一、拷贝构造函数

1.1 什么是拷贝构造函数?

1.2 为什么得是引用?

1.3 使用拷贝构造函数

1.4 拷贝构造函数有什么用?

二、运算符重载

2.1 什么是运算符重载?

2.2  尝试前须知

2.3 常见运算符重载

2.3.1+=运算符重载

2.3.2+运算符重载

2.3.3前置++和后置++运算符重载

三、下期预告


前言:C++初阶系列,每一期博主都会使用简单朴素的语言将对应的知识分享给大家,争取让所有人都可以听懂,C++初阶系列会持续更新,上学期间将不定时更新,但总会更的

一、拷贝构造函数

1.1 什么是拷贝构造函数?

拷贝构造函数是构造函数的重构,也就是说它也没有需要返回的东西,同样是为了构造成员而生。

拷贝构造函数只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。

1.2 为什么得是引用?

为什么这个形参得是被类对象的引用呢,我直接传递我这个要拷贝的目标不可以吗,不是一样的操作吗。有如下代码就完美的符合你的想法

#include<iostream>
using namespace std;
class Date
{
public:

	Date(int year = 1,int month=1,int day=1)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	Date(Date date)
	{
		_year = date._year;
		_month = date._month;
		_day = date._day;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{

}

现在的编译器很智能,直接就阻止了你的无穷递归行为,为什么会发生无穷递归呢。

这样说吧,假设你有一个Date d和你个test函数,你想将d传递给test函数,于是编译器就会调用这个拷贝构造函数,而调用这个拷贝构造函数的时候你会生成一个叫做date的形参,而这个形参刚好也是Date类型的变量,那么它也会走向这个拷贝构造函数,于是拷贝构造函数调用拷贝构造函数,再调用拷贝构造函数.......

1.3 使用拷贝构造函数

简单的拷贝并打印一下,代码什么的自己去敲一遍效果好一些,别光看,至于为什么要加const是因为我们传递过去的变量是被拷贝的,是不会被修改的   加个const是为了避免一些低级错误的发生,比方说修改到了被拷贝的对象,同时增加了代码的可读性。

1.4 拷贝构造函数有什么用?

学到这里,大家恐怕也是明白了,拷贝构造函数就是简单地将目标内容拷贝给新定义的对象罢了, 那么它有用吗,这是很多初学者的疑惑,实际上它不仅仅是有用,它是很有用。

比方说,我们现在实现的日期类的拷贝构造函数,其实只是涉及到了一个简单的值拷贝,而到后期我们使用什么栈啊,堆啊,二叉树之类的东西,我们如果还是简单地进行值拷贝,我们拷贝的东西不就只有一具空壳吗,我们得采取一些方式实现深拷贝,也就是把栈里面的值都给拷贝出来的那种拷贝,如此才可以保证这两个东西一模一样,才能够达到预期的效果。

二、运算符重载

2.1 什么是运算符重载?

其实很多小伙伴应该在使用C语言的时候就有过这样的苦恼,我这结构体+结构体没法玩啊,我得用.或->获取结构体成员才能够对里面的成员进行操作啊,太费劲了,就是写了个函数,还得来个d3=addition(d1,d2);就不能d1+d2吗    在C++中,是可以实现的,这个操作就叫做运算符重载,也就是对运算符进行补充定义。

2.2  尝试前须知

operator用在运算符重载上,比方说+运算符的重载,在进行重载部分的书写时,我们就得在之前加上operator,大概可以用这个公式阐述:返回类型+operator+重载的运算符(参数)

运算符重载既可以写在类的里面,也可以写在类的外面    而写在类的外面我们往往会用到一个操作叫友元,这个操作的大致意思就是令你这个在类外面的东西成为我这个类的朋友,因此你这个类外面的东西就可以访问到类中private中的内容,对于友元这里不再赘述,之后会进行讲解。

有的小伙伴又会有些问题,那么我们直接把private去掉,或者不在private中定义成员变量。我想说的是,这样多少有点舍本逐末了,因为在C++中之所以会有类的原因,有一部分就是因为多个结构体的函数和变量过于混乱,而按你的方法去做,那么这个类的成员变量所有人都可以进行操作,那哪还有什么规矩,这个类的创建又有什么意义?

因此,博主在进行运算符重载的时候使用的方法是在类中进行运算符重载,这样既可以访问到私有的成员变量,还可以保证代码的严谨性。

注意:
1.不能通过连接其他符号来创建新的操作符:比如operator@ 
2.重载操作符必须有一个类类型参数
3.用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
4.作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐
藏的this
5. .*   ::    sizeof    ?:    . 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。这5个死记硬背记住就ok了。

2.3 常见运算符重载

2.3.1+=运算符重载

目标:实现一个日期+天数,日期被修改为过了多少天的日期

很多人第一次写会写成这样,而编译器报错是因为多了一个this指针过去,已经达到了三目运算符的操作了   因此我们只需要把Date d1去掉即可,但因为有this指针的存在,我们一样能对这个变量进行操作。

实现这个之前我们可以写一个GetMonthDay函数来获得没一月份的天数,值得注意的一点是闰年时2月为29日,接着我们来讲讲实现思路,我们的返回值最好设置成Date&型的,因为+=操作的目标出了函数作用域在main中依然存在,因此使用Date&类型的返回值可以令编译器的效率得到提高。

可以先在目标的_day上加上day,这样能方便之后的进位,比方说2023-11-16 +100就先处理成2023-11-116,之后通过GetMonthDay取得的具体进位数据来进行进位即可,这里就可以通过循环实现,当_day>GetMonthDay时意味着需要进位,因此可以以这个来作为循环是否继续的条件,之后的实现便只需要注意一些细节即可,比方说,月满12进1之类的。

	int GetMonthDay(int year, int month)
	{
		int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		//之所以是13是为了更加符合日期的返回,一月就返回数组下标为1的值
		if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
		{
			return 29;
		}
		return arr[month];
	}
	Date& operator +=(int day)
	{
		_day += day;
		while (_day > GetMonthDay(_year,_month))
		{
			_day -= GetMonthDay(_year, _month);
			_month++;
			if (_month>12)
			{
				_month = 1;
				_year++;
			}
		}
		return *this;
	}

测试:

2.3.2+运算符重载

有了+=运算符之后+运算符就很好操作了,复用一下就好 

使用临时变量的原因是因为,+运算符并不改变原来变量的值,比方说a=b+100;这里的b也不会被修改

	Date operator+(int day)
	{
		Date tmp = *this;
		tmp += day;
		return tmp;
	}

2.3.3前置++和后置++运算符重载

在C++中前置++和后置++如果我们要对它进行重载,你就会惊讶的发现,它们两的运算符名字其实是一模一样的,这怎么进行区分呢,祖师爷其实也没有太好的办法,他对这个地方做了特殊化处理,就像我们做oj题时遇到的特殊情况,单独处理一样。祖师爷也是这么做的,他规定前置++和后置++的区别就在于,后置++的参数有个int型的

什么意思?差不多是这样,operator++(),operator++(int)前面的就代表着前置++,后面的那个就代表着后置++,那为什么是int,不能是float吗。我只能这么说,这是巧合,祖师爷就想拿int来区分,仅此而已。

有了+和+=实现起来就直接复用就好了

三、下期预告

大概在明天,博主会来一篇日期类实现详解,那里面会讲到友元操作,期待你的到来QAQ 

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

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

相关文章

vs2017打开工程提示若要解决此问题,请使用以下选择启动 Visual Studio 安装程序: 用于 x86 和 x64 的 Visual C++ MFC

下载 error MSB8036: 找不到 Windows SDK 版本8.1。请安装所需的版本的 Windows SDK 或者在项目属性页中或通过右键单击解决方案并选择“重定解决方案目标”来更改 SDK 版本。 error&#xff1a;D8016 “/ZI”和“/Gy-”命令行选项不兼容 ”问题解决

Maven项目指定main方法配置

例如有个maven工程 打包后 xxx.jar 而这个maven工程里可能有很多main方法,比如测试的main方法 插件指定 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId>&…

2023数维杯国际赛数学建模竞赛选题建议及B题思路讲解

大家好呀&#xff0c;2023年第九届数维杯国际大学生数学建模挑战赛今天早上开赛啦&#xff0c;在这里先带来初步的选题建议及思路。 目前团队正在写B题和D题完整论文&#xff0c;后续还会持续更新哈&#xff0c;大家三连关注一下防止迷路。 注意&#xff0c;本文只是比较简略…

dvwa 文件上传漏洞通关攻略

dvwa 文件上传漏洞通关攻略 文章目录 dvwa 文件上传漏洞通关攻略low等级mediumhighimpossible 练习文件上传漏洞的攻击与防御 low等级 点击文件上传进行测试上传个一句话木马 <?php eval($_REQUEST[777]);?>上传成功 访问上传路径 进行蚁剑连接 代码审计 <?ph…

AOF是什么?

目录 一、AOF是什么&#xff1f; 二、使用AOF 三、命令写入 四、重写机制 4.1 触发AOF 4.2 AOF执行流程 一、AOF是什么&#xff1f; AOF是Append Only File&#xff0c;是Redis中实现持久化的一种方式。以独⽴⽇志的⽅式记录每次命令&#xff0c;重启时再重新执⾏ AOF ⽂件中的…

创邻科技亮相ISWC 2023,国际舞台见证知识图谱领域研究突破

近日&#xff0c;第22届国际语义网大会 ISWC 2023 在雅典希腊召开&#xff0c;通过线上线下的形式&#xff0c;聚集了全球的顶级研究人员、从业人员和行业专家&#xff0c;讨论、发展和塑造语义网和知识图谱技术的未来。创邻科技CEO张晨博士作为知识图谱行业专家受邀参会&#…

SystemVerilog学习(8)——包的使用

目录 一、包的定义 二、导出包的内容 1、可以通过域的索引符::号直接引用 2、可以指定索引一些需要的包中定义的类型到指定的容器中 3、通过通配符*来将包中所有的类别导入到指定容器中 三、包的使用 在进行本文的学习之前&#xff0c;首先需要对SV中类相关的内容有充分的认识…

PCL 提取点云边界轮廓-AC方法、平面轮廓

一、概述 PCL点云边界特征检测 &#xff08;附完整代码 C&#xff09;_pcl计算点云特征值_McQueen_LT的博客-CSDN博客 在点云的边界特征检测&#xff08;网格模型的边界特征检测已经是一个确定性问题了&#xff0c;见 网格模型边界检测&#xff09;方面&#xff0c;PCL中有一…

智慧城市大脑数据中台解决方案:PPT全套37页,附下载

关键词&#xff1a;智慧城市大脑解决方案&#xff0c;数据中台解决方案&#xff0c;智慧城市建设&#xff0c;数据中台建设&#xff0c;智慧城市大脑建设&#xff0c;数据中台建设架构 一、智慧城市大脑数据中台建设背景 智慧城市大脑数据中台是一个面向城市级数据管理、开发和…

双剑合璧:基于Elasticsearch的两路召回语义检索系统,实现关键字与语义的高效精准匹配

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

传递函数的推导和理解

传递函数的推导和理解 假设有一个线性系统&#xff0c;在一般情况下&#xff0c;它的激励 x ( t ) x(t) x(t)与响应 y ( t ) y(t) y(t)所满足的的关系&#xff0c;可用下列微分方程来表示&#xff1a; a n y ( n ) a n − 1 y ( n − 1 ) a n − 2 y ( n − 2 ) ⋯ a 1 y…

1分钟精准预测未来10天天气,谷歌开源GraphCast

11月15日&#xff0c;谷歌旗下著名AI研究机构Deepmind在官网宣布&#xff0c;开源天气大模型GraphCast&#xff0c;并公布了论文。 据悉&#xff0c;GraphCast可以在1分钟内&#xff0c;精准预测而来全球10天的天气情况&#xff0c;同时可以提前预警大暴雨、大风雪、洪水、高温…

【Linux网络】搭建内外网的网关服务器,实现DNS分离解析与DHCP自动分配

一、实验要求&#xff1a; 二、实验思路剖析&#xff1a; 网关服务器&#xff1a; 客户端准备&#xff1a; 实操&#xff1a; 第一步先安装dhcp服务和bind服务 第二步双网卡&#xff0c;配置网卡的ip地址 第三步&#xff1a;开始配置dhcp 第四步&#xff1a;做dns分离解析…

Vue|props配置

props是Vue中用于传递数据的属性。通过在子组件的选项中定义props属性&#xff0c;可以指定子组件可以接收的数据以及其他配置选项。父组件可以通过在子组件上使用特定的属性来传递数据。 目录 目录 App.vue 什么是App.vue 组件引用 props配置 组件复用 案例1&#xff1a…

吉利银河L6顶配 官方OTA升级降低充电速度

互联网是有记忆的 你宣传充电口 卖出去又更新降低速度 属于诈骗 吉利新车上市两个月官降1w,希望大家引以为戒,可以买,但是刚出别着急做韭菜

AE 的软件、硬件、驱动控制、调试策略(没有算法)

#灵感# AE是个值得推敲再推敲的模块&#xff0c;有意思。 目录 相关的硬件-光圈&#xff1a; 相关的软件-曝光-ISO&#xff1a; ISP中的sensor AE 组成&#xff1a; sensor AE的流程及控制&#xff1a; tuning时AE的一些策略&#xff1a; 相关的硬件-光圈&#xff1a; 光…

网络安全(大厂面试真题集)

前言 随着国家政策的扶持&#xff0c;网络安全行业也越来越为大众所熟知&#xff0c;想要进入到网络安全行业的人也越来越多。 为了拿到心仪的 Offer 之外&#xff0c;除了学好网络安全知识以外&#xff0c;还要应对好企业的面试。 作为一个安全老鸟&#xff0c;工作这么多年…

t-product的matlab实现

t-product是一个比较好的概念&#xff0c;相对应于矩阵中的乘法。 定义如下 这里的 circ(A),MatVec(b) 的定义分别如下 这么定义的原因是为了映射到FFT域里面去&#xff0c;简化计算。 上面的一段摘录说明&#xff1a;直接按照定义来计算&#xff0c;会耗费大量的计算资源。因…

【2.5w字吐血总结 | 新手必看】全网最详细MySQL笔记

写在前面 鉴于全网MySQL知识点的总结分散难懂、良莠不齐&#xff0c;为了避免初学者少走弯路&#xff0c;更好更快地掌握MySQL知识&#xff0c;博主特地将自己所学的笔记分享出来。 如果想深度理解掌握MySQL&#xff0c;欢迎订阅专栏&#xff1a;MySQL进阶之路【秋说】&#…

adguarg通过dns代理全局过滤广告,全系统操作指南

路由器dns配置 安卓(鸿蒙) 设置>>其他网络与连接>>私人DNS&#xff08;不同手机系统设置名称会有些许出入&#xff0c;但是大差不差&#xff09; &#xff08;左图鸿蒙&#xff09;&#xff1a;将域名m.centos.chat填入手机私人DNS IOS系统 将代理服务器IP&am…