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

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

目录

一、拷贝构造函数

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 

相关文章:

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

目录 一、拷贝构造函数 1.1 什么是拷贝构造函数&#xff1f; 1.2 为什么得是引用&#xff1f; 1.3 使用拷贝构造函数 1.4 拷贝构造函数有什么用&#xff1f; 二、运算符重载 2.1 什么是运算符重载&#xff1f; 2.2 尝试前须知 2.3 常见运算符重载 2.3.1运算符重载 …...

使用Postman进行压力测试

1.打开Postman新建测试接口 2.点击右边保存&#xff0c;选择一个文件集合&#xff0c;如果没有就创建&#xff0c;然后保存 就是这个东西&#xff0c;这里不便展示出来&#xff0c;压力测试需要在文件夹里面进行 3.选择要测试的接口&#xff0c;iterations 表示请求发起次数&a…...

AI视频检索丨历史视频标签化,助力重要事件高效溯源

随着科技的不断发展&#xff0c;安全监控已成为我们生活中不可或缺的一部分。当发生盗窃、人员走失、安全事故等重要事件时&#xff0c;常常需要通过查看视频回放了解事情经过&#xff0c;为解决问题提供证据或指明查找方向。但是&#xff0c;人工查看视频回放往往费时费力&…...

【前段基础入门之】=>CSS3新特性 响应式布局

文章目录 概念媒体查询媒体类型媒体特性媒体运算符 概念 所谓对响应式布局方案的理解&#xff0c;众说纷纭&#xff0c;核心点就是同一套代码在不同尺度屏幕下的布局呈现方式的不同 社区中有很多人分享&#xff0c;并列出了多种实现响应式布局的方案&#xff0c;比如【 rem&…...

【Java 进阶篇】JQuery 遍历:发现元素的魔法之旅

欢迎来到 JQuery 的奇妙世界&#xff0c;一个充满活力和灵感的地方。在这个世界里&#xff0c;我们将一起探讨 JQuery 的遍历功能&#xff0c;这是一个让你轻松发现和操作网页元素的神奇工具。无需太多前端经验&#xff0c;只要有一颗探险的心&#xff0c;你就能在 JQuery 遍历…...

合肥数字孪生赋能工业制造,加速推进制造业数字化转型

聚焦国家战略需求和先进制造业发展方向&#xff0c;加快数字化发展战略部署&#xff0c;数字孪生、工业互联网、工业物联网已被广泛认为是工业革命的新引擎。合肥数字孪生正在推动工业制造从制造转向智造。通过数字化建模和仿真的方式&#xff0c;优化设计、生产、质量管理、供…...

Linux发展史与环境安装

Linux发展史与环境安装 一、Linux发展史推动技术进步的基本模式理解操作系统的发展理解Linux操作系统的发展 一、Linux的环境安装 一、Linux发展史 Linux和window XX其实都是一样的&#xff0c;定位&#xff1a;操作系统&#xff0c;企业内部&#xff0c;要给用户提供“互联网…...

【uniapp】 video视频层级、遮挡其他弹窗或顶部导航 使用nvue覆盖

uniapp 顶部导航和弹窗被video遮挡解决办法 第一步&#xff1a;配置 subNVues {"path": "pages/index/index","style": {"navigationBarTitleText": "uni-app","navigationStyle": "custom","app-…...

opencv(1):创建和显示窗口, 读取保存图片

下载源码&#xff0c;方便查看 API 信息。 快速在源码文件夹中搜索相关 api. grep“namedWindow(*-Rn// 限定 .h 文件 grep“namedWindow(*-Rn|grep "\.h" vscode 语法检测有问题 一直有波浪线 打开 vscode, setting 界面&#xff0c;搜索 python 在 setting.json…...

LeetCode530. Minimum Absolute Difference in BST

文章目录 一、题目二、题解 一、题目 Given the root of a Binary Search Tree (BST), return the minimum absolute difference between the values of any two different nodes in the tree. Example 1: Input: root [4,2,6,1,3] Output: 1 Example 2: Input: root [1,…...

Flink(五)【DataStream 转换算子(上)】

前言 这节注定是一个大的章节&#xff0c;我预估一下得两三天&#xff0c;涉及到的一些东西不懂就重新学&#xff0c;比如 Lambda 表达式&#xff0c;我只知道 Scala 中很方便&#xff0c;但在 Java 中有点发怵了&#xff1b;一个接口能不能 new 来构造对象? 答案是可以的&…...

【vitis】 AIE basic

AIE vs AIE-ML versal 期间分类 文件 操作 vitis -new -w . 安装...

微信抽奖活动怎么做

微信抽奖活动&#xff1a;打破传统&#xff0c;创新互动&#xff0c;带给你超乎想象的惊喜体验&#xff01; 随着互联网的飞速发展&#xff0c;人们越来越热衷于参与各种线上活动。而微信&#xff0c;作为中国最大的社交平台之一&#xff0c;自然成为了各种活动的聚集地。今天…...

装机必备!这5款免费软件,你值得拥有!

​ 目前win7渐渐退出视野&#xff0c;大部分人都开始使用win10了&#xff0c;笔者在日常的工作和使用中&#xff0c;为了能够让效率的大提升&#xff0c;下载了不少软件&#xff0c;以下的软件都是个人认为装机必备&#xff0c;而且都是可以免费下载。 1.屏幕亮度调节——Twin…...

华为eNSP综合实验考试

VLAN信息表 设备名称 端口 链路类型 VLAN 参数 HZ-HZCampus-Agg01-S5731 GE0/0/1 Trunk PVID:1 Allow-pass&#xff1a;10 20 Eth-trunk1&#xff08;GE0/0/2,0/0/3,0/0/23&#xff09; Trunk PVID:1 Allow-pass&#xff1a;10 20 GE0/0/24 Access PVID&#xf…...

OPPO Watch纯手机开启远程ADB调试

Wear OS手表中&#xff0c;我们可以直接在开发者设置中打开WiFi调试。但是这在OPPO等魔改Android系统中不再奏效。 需要什么&#xff1f;&#xff1f; 手表一台手机一个OTG转接头一个手表充电器一个 演示设备 手机&#xff1a; OPPO Find X手表&#xff1a; OPPO Watch 1代 …...

idea查看UML类图

idea查看UML类图 一、如何查看UML类图 1.1 选择需要查看的类或者包&#xff0c;鼠标右键&#xff0c;选择Diagrams->Show Diagram 1.2 对于UML类图中的包&#xff0c;选中后点击鼠标右键-> Expand Nodes(展开节点) 展开前 展开后 1.3 展开后分布比较凌乱&#xff…...

2736. 最大和查询 : 从一维限制到二维限制,逐步思考剖析本题(进阶一问)

题目描述 这是 LeetCode 上的 「2736. 最大和查询」 &#xff0c;难度为 「困难」。 Tag : 「排序」、「离散化」、「树状数组」 给你两个长度为 n、下标从 0 开始的整数数组 nums1 和 nums2&#xff0c;另给你一个下标从 1 开始的二维数组 queries&#xff0c;其中 。 对于第…...

2023数维杯国际数学建模A题B题C题D题思路+模型+代码+完整论文

目录 1.数维杯各题思路模型&#xff1a;比赛开始后&#xff0c;第一时间更新&#xff0c;获取见文末名片 3 常见数模问题常见模型分类 3.1 分类问题 3.2 优化问题 详细思路见此名片&#xff0c;开赛第一时间更新 1.数维杯各题思路模型&#xff1a;9.7晚上比赛开始后&#x…...

java多个jar包编译生成.class文件

有时候需要通过多个jar包让java文件生成 .class字节码文件&#xff0c;这里主要记录一下格式问题 javac -cp a.jar;b.jar a.java...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...