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

C++——类和对象(3)

作者:几冬雪来

时间:2023年5月6日

内容:C++类和对象内容讲解

目录

前言: 

1.运算符重载(续): 

2.赋值重载:

结尾: 


前言: 

在上一篇博客中我们再一次讲解了类和对象的内容,并且引入了一个新的重载模式——运算符重载,那么今天我们就接着对其进行说明。 

1.运算符重载(续): 

在上一篇博客中我们讲解了一个日期类运算符重载的实现,也得知了运算符重载的话,如果是内置类型的话我们可以不进行书写,如果是自定义类型的话,我们就要对其进行书写。

我们也进行了日期的比较。 

但是并不是所以运算符都是有意义的。 

还是以我们的日期类函数为例:

比如:日期减日期可以算出我们两个日期间隔的天数,它是有意义的;但是在这里日期加日期就是没有意义的行为了。 

而是否要重载运算符,取决于这个这个运算符对类有无意义

 

类似我们这个代码,这两种写法从底层来讲是一样的。

因此在编译器来看,我们的第一个代码等价与第二个代码,在过程中我们的第一个代码就转换为第二个代码的指令。 

但是这个代码是在类的外面的,因此我们无法去访问私有和保护

在这里我们有两种方案,一种是友元这是我们后面才需要学习的知识,另一种方法则是将其放进类中。 

但是在这里我们将代码放入类中的时候,代码报错了,这是因为在运算符重载的时候我们C++中有所规定

在类中,作为类成员函数重载的时候,其形参看起来比操作数数目少1,因为在类中成员函数的第一个参数为隐藏的this

且必须有一个参数为类类型,也就是自定义类型

 

像这种两个都是内置类型的就会发生报错,因此至少要有一个自定义类型的。 

操作符有几个操作数,重载就有几个参数

因此我们的代码要进行修改。

而在我们学到现在的所有的运算符中,有五个运算符不能进行重载操作。 

这个知识点一般会出现在选择题当中。 

2.赋值重载:

接下来我们来讲解赋值重载。

首先在这里我们就要区分一下这两种情况,一种是两个对象都存在,一种是对另一个对象进行初始化的操作

在这里我们也可以轻而易举的写出我们的代码,但是像这种代码的话有一个不足的点

在我们的编译器中,我们可以在C语言和C++中写出这种赋值的代码。

这里的赋值顺序是从右到左进行赋值。 

但是在我们上面的赋值重载中,因为我们并没有返回值为void

因此在进行了第一次重载之后,我们就没有办法顺利的进行第二次重载了。

因此我们的代码要修改成这个样子,返回的是this指针,又因为节省空间因此在这里我们还要对其进行引用的操作

这样我们就是返回的就是d4的一个别名了,同时也不用担心出作用域销毁的事情。 

因为我们的赋值重载和拷贝构造一样,所以我们可以让编译器自己帮我们创建。

如果是栈的话,就需要我们自己去创建。 

这里还要了解的一个点是:

赋值运算符只能重载类型成员不能重载全局函数

默认成员函数不能写到全局。

同时我们的声明和定义也可以进行分离

这里就是我们的日期类小于形的代码的声明和定义的分离

但是我们的日期类可用的操作符远不止小于这一个操作符。

类似大于,减号,等于等操作符都可以用在日期类中

我们这里可以像上面的代码一样各自书写一个大于,等于的代码出来。但是这样做的话就增加了代码的数量,减少了可读性。在这里我们还有什么其他的方法吗?

像这里我们先写一个==类型的重载,然后下来的代码就进行一个另一种方法的书写,如我们上面的代码一样

这样就能简单的写出我们日期类的各种比较。

同时日期加天数和日期减日期也可以通过这种方式来完成

要执行上面操作的话,我们首先就要算出每个月的天数

这个操作我们写过很多次,这里就不再重复了。 

再下来我们就只需要书写它的代码即可。

在这里我们如果使用的是引用的话,最后会提防因为销毁的原因出现问题,因此在这里我们采用的是这一种写法。 

构造函数也是为了防止其销毁。 

而且我们也可以由我们的+来引入+=的代码。 

像上面左右的代码都是正确的,不过二者相对比左边的代码要更优一点。 

这是因为左边的代码只需要创建两个对象,而右边的这种却要四个,+=的有一些亏

同时我们的日期类还是其他的操作符可以对其使用。

类似我们的日期可以进行++操作

只不过我们的++是单运算符。 

但是众所周知在C语言中我们的++操作符分为了前置和后置

因此在这里我们的代码到底是调用的哪一个?

用我们以前的知识来讲解。

前置++是返回++后的值,后置++是返回++前的值

虽然它们的内部都要进行++操作,所以不能用同一个运算符重载替代

为此,我们为后置++中的参数提供了int。

增加这个int并不是为了接收具体的值,这仅仅是为了占位,根前置++构成重载

因为后置++需要进行创建对象,我们就将其牺牲掉了。

同时,前置++和后置++,在底层所代表的也不相同

在这里我们可以看见,后置++我们的括号能没有任何东西,而前置++中则有加入一个随机的数来对其进行一个区分。 

结尾: 

到这里我们的又增加了对类和对象的了解,并且这几篇博客的内容都有关联,如果在哪里没有学好的话,可能会导致后序课程的乏力,因此有空的时候要对其进行复习。最后希望这篇博客能有所帮助。

相关文章:

C++——类和对象(3)

作者:几冬雪来 时间:2023年5月6日 内容:C类和对象内容讲解 目录 前言: 1.运算符重载(续): 2.赋值重载: 结尾: 前言: 在上一篇博客中我们再一次讲解了…...

itop-3568开发板驱动学习笔记(24)设备树(三)时钟实例分析

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 生产者属性#clock-cells 属性clock-output-namesclock-frequencyassigned-clockclock-indicesassigned-clock-parents 消费者属性 设备树中的时钟信息以时钟树形式体现,时钟树包括时钟的属性和结…...

linux中使用docker部署微服务

目录 一、制作jar包(如果看一眼很简单,可以直接使用结尾的jar) 1.首先创建一个微服务 demo2 2.启动微服务(在DemoApplication上右键执行启动就行) 注意:其他操作导致的 可能遇到的报错 3.修改端口 4.新…...

操作系统考试复习—第三章 优先级倒置 死锁问题

当前OS广泛采用优先级调度算法和抢占方式,然而在系统中存在着影响进程运行的资源从而可能产生"优先级倒置"现象 具体解释为:在原本的调度算法设计中,高优先级进程可以抢占低优先级的CPU资源,先执行高优先级任务。但是存…...

OpenHarmony送显流程分析

OpenHarmony送显流程分析 引言 本文档主要记录OpenHarmony在渲染完成之后如何进行合成和送显流程的。这个过程牵涉的代码很多,而且流程也是比较繁琐的。所以我一定要坚持下来。千万不能半途而废,也不要想着一口气吃出一个胖子,路漫漫其修远兮…...

Java面试题字节流字符流

String 编码UTF-8 和GBK的区别 GBK编码:是指中国的中文字符,其实它包含了简体中文与繁体中文字符,另外还有一种字符 “gb2312”,这种字符仅能存储简体中文字符。 UTF-8编码:它是一种全国家通过的一种编码&#x…...

Self-Attention结构细节及计算过程

一、结构 上面那个图其实不是那么重要,只要知道将输入的x矩阵转换成三个矩阵进行计算即可。自注意力结构的输入为 输入矩阵的三个变形 Q(query矩阵)、K(key矩阵)、V(value矩阵)构成,…...

在Ubuntu18.04中安装uWebSockets库

目录 1.下载uWebSockets库2.下载uSockets3.安装openssl开发包4.编译首先说明这里使用的Ubuntu版本为18.04。 1.下载uWebSockets库 下载uWebSockets库有两种方式,一是终端,从Github中克隆uWebSockets库到Ubuntu本地文件夹,二是打开uWebSockets库下载链接自己下载到Windows,然…...

【Fluent】接着上一次计算的结果继续计算,利用计算过程中得到的物理场(温度、速度、压力等)插值Interpolate文件初始化模型的方法

一、问题背景 因为fluent中支持的初始化无非三种类型。 1、Standard initialization 标准初始化 2、Hybridinitialization 混合初始化 3、FMG initialization FMG初始化 另外,还可以用UDF通过坐标判断的方式予以初始化。 但是这些初始化方法都没办法利用以前计算过…...

第二十九章 使用消息订阅发布实现组件通信

PubSubJS库介绍 如果你想在React中使用第三方库来实现Pub/Sub机制,PubSubJS是一个不错的选择。它是一个轻量级的库,可以在浏览器和Node.js环境中使用。 PubSubJS提供了一个简单的API,可以让你在应用程序中订阅和发布消息。你可以使用npm来安…...

Transformer的位置编码

1. 什么是位置编码,为什么要使用位置编码 简单来说位置编码就是给一个句子中的每个token一个位置信息,通过位置编码可以明确token的前后顺序关系。 对任何语言来说,句子中词汇的顺序和位置都是非常重要的。它们定义了语法,从而定…...

Python学习简记

做题时遇到的不知道的知识点会更新在此: python中的int()函数可以用于进制转换 该函数最为常见的使用是用于强制类型转换,实际上,它可以有两个参数 值得强调的是当传入两个参数时第一个参数一定要是字符串类型 字符串方法: lower(…...

windows搭建一个FTP服务器超详细

一.场景: 在开发过程中需要FTP文件上传下载功能,需要在本地或者服务器上搭建一个FTP服务器。 二.详细步骤: 1. 安装FTP服务器支持和配置IIS web服务器 打卡“启动关闭Window功能” 控制面板>程序>启动或关闭Windows功能 或者选择快…...

u01使用率100%报错归档满的问题

今天下午客户报数据库无法连接了,我也立刻登录查看 因为显示orcl1归档满了,我就登录查看磁盘组的空间,发现空间空余很多 就sqlpus登录了,发现u01使用率满了 [oracledb1 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 …...

Packet Tracer - 配置扩展 ACL - 场景 2

Packet Tracer - 配置扩展 ACL - 场景 2 拓扑图 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 RTA G0/0 10.101.117.49 255.255.255.248 不适用 G0/1 10.101.117.33 255.255.255.240 不适用 G0/2 10.101.117.1 255.255.255.224 不适用 PCA NIC 10.101…...

最近面了12个人,发现这个测试基础题都答不上来...

一般面试我都会问一两道很基础的题目,来考察候选人的“地基”是否扎实,有些是操作系统层面的,有些是 python语言方面的,还有些… 深耕IT行业多年,我们发现,对于一个程序员而言,能去到一线互联网…...

JAVA基于Springboot框架的停车场管理系统开发实践和实现【附源码】

运行环境: jdk1.8idea/eclipsemaven3mysql5.6 项目技术: Java,Springboot,mybatis,mysql,jquery,html 该系统为停车场管理人员提供了对停车场中车辆,车位和财务的管理。操作员可以灵活地使用相关权限开展工作。在车位管理,车辆的停放和驶离、缴费&a…...

[230501] 4月29日考试真题第一篇|Temporary Pools

题目来源:http://t.csdn.cn/goCDT 正确率:6/10 目录​​​​​​​ Temporary Pools 题目 Temporary Pools Paragraph 1: Temporary pools are freshwater habitats that retain water for only three to four months of the year or even shorter pe…...

Qt中QString, int等数据转换以及Qt与Halcon联编程序打包

一、Qt中QString, int等数据转换 在QT中,数值类型转为字符串类型,一般是可以使用 QString::number(); 示例: int num = 65; QString ab = QString::number(num); 其实还可以转为不同的进制字符串,比如 int num = 65; QString ab = QString::number(num,10); //十进…...

Android FlexboxLayout布局

FlexboxLayout 布局 一、简介二、使用三、功能详解FlexboxLayout属性flexWrapflexDirectionalignItemsjustifyContentalignContentdividerDrawableHorizontal、showDividerHorizontaldividerDrawableVertical、showDividerVerticaldividerDrawable、showDividermaxLine Flexbox…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...