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

2023-05-16

作者:几冬雪来

时间:2023年5月6日

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

目录

前言: 

1.运算符重载(续): 

2.赋值重载:

结尾: 


前言: 

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

1.运算符重载(续): 

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

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

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

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

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

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

 

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

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

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

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

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

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

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

 

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

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

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

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

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

2.赋值重载:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

结尾: 

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++——类和对象(4) 的相关文章

随机推荐

  • Linux安装pqsql

    PostgreSQL安装部署 1 解压 tar xvf postgresql 10 5 1 linux x64 binaries tar gz 将解压文件重命名 mv pgsql postgresql PostgreSQL无法在root用户
  • 高考失败的程序员的逆袭

    高考作文不得出现真实的校名和人名 xff0c 所以本文不包含任何真实的校名 人名乃至赞助学校的企业名 xff0c 小说情节纯属虚构 如果情节与现实生活的事实雷同 xff0c 请谨记 xff1a 英国有个人叫牛顿 xff0c 德国有个人叫莱布
  • Android程序员的十大转型之路

    IT行业是一个瞬息万变的行业 xff0c 程序员是一个不进则退的职业 我作为一个Android程序员 xff0c 多年来一直保持随时可以转型其他技术领域的状态 xff0c 保持对新技术敏感的嗅觉 我先说说Android程序员不可能转型的几个
  • 【玖哥乱弹】编程语言间的斗争

    在初级程序员阶段 xff0c 每个人都不可避免遇到选择编程语言和职业方向的难题 我挑选了几个常见的编程语言 xff0c 分析了优缺点和职业方向 xff0c 以供想当程序员的人参考 C C 43 43 一句话概括 xff1a 大多数中国程序员
  • 【玖哥乱弹】成功的IT人士这样转型AI

    AlphaGo在与围棋世界冠军的对弈大获全胜 xff0c 不但让我们领略到了AI的巨大潜力 xff0c 还把AI推上了新的浪潮之巅 作为一个从即将过去的移动互联网时代走来的Android工程师 xff0c 我深深感受到自己成了传统行业 xf
  • 【玖哥乱弹】程序员如何成为别人的男朋友

    这个世界上程序员数量很多 xff0c 有女朋友的程序员在其中的比例却很少 究其原因 xff0c 不外乎大多数程序员根本不知道怎么才能成为别人的男朋友 成为别人的男朋友对于富二代和拆迁户很容易 xff0c 而对于程序员却很难 xff0c 潘驴
  • Linux库函数之opendir/closedir/readdir

    在Linux环境下 xff0c 有时候需要编写一些实用的工具 xff0c 比如检索功能 xff0c 最近在做病毒查杀应用开发 xff0c 涉及到批量扫描指定目录下文件 xff0c 因为要测试大量病毒文件 xff0c 该部分功能又是要通过AP
  • 编译ROS包出现错误 提示:invoking "make cmake_check_build_system" failed

    问题原因 xff1a 不同包里不允许有重名的节点 解决方案 xff1a 编辑重复的package文件夹里的CMakeLists txt文件 xff0c 对涉及到节点名称的代码进行修改 调试过程 xff1a 逐行分析问题代码 xff0c 问题
  • Centos7.X添加本地至Docker用户组

    根据上篇文章 Centos7 X通过rpm包安装Docker 安装好Docker之后 xff0c 发现必须使用sudo提权的方式或者直接使用root方式才能操作docker xff0c 实际上我们平常登录都是自己的账户 xff0c 这样操作
  • pytorch填坑:RuntimeError: cudnn RNN backward can only be called in training mode

    运行pytorch时 xff0c 训练很正常 xff0c 但是如果切换到eval 模式之后再继续训练 xff0c 发现报错 xff1a RuntimeError cudnn RNN backward can only be called i
  • Linux Mint 18.2安装VMware Workstation Pro 12

    VMware Workstation xff08 中文名 威睿工作站 xff09 是一款功能强大的桌面虚拟计算机软件 xff0c 提供用户可在单一的桌面上同时运行不同的操作系统 xff0c 和进行开发 测试 部署新的应用程序的最佳解决方案
  • ubuntu 使用nginx和gunicorn 部署服务

    1 安装gunicorn pip install gunicorn 2 创建下列名为web py的文件 xff1a from flask import Flask app 61 Flask name 64 app route 39 39 d
  • unable to execute ':/usr/local/cuda/bin/nvcc': No such file or directory

    仔细看下面的错误 xff1a unable to execute 39 usr local cuda bin nvcc 39 No such file or directory 是多了一个冒号 解决方式 xff1a vi bashrc 将
  • ubuntu系统设置ssh连接端口

    1 sudo vim etc ssh sshd config 将其中的 Port 22行取消注释 xff0c 并且将22换成自己想要的端口 xff0c 例如5677等 2 重启ssh服务 systemctl restart sshd net
  • anaconda 环境查找虚拟环境

    1 查找虚拟环境 conda info envs 会出现如下结果 2 选择虚拟环境 source activate tensorflow p36 3 退出虚拟环境 source deactivate 4 安装librosa conda in
  • python logging.info在终端没输出

    问题描述 在pyhton脚本中logging info 34 hello world 34 希望输出 39 hello world 39 但是在终端没有输出 解决方法 在文件开始的地方添加以下内容 span class pln style
  • ImportError: libSM.so.6: cannot open shared object file: No such file or directory解决

    运行如下命令即可解决 span class pln style margin 0px padding 0px border 0px font style inherit font weight inherit font size 6 lin
  • linux 查看版本信息

    1 uname xff0d a xff08 Linux查看版本当前操作系统内核信息 xff09 Linux ml 4 4 0 109 generic 132 Ubuntu SMP Tue Jan 9 19 52 39 UTC 2018 x8
  • 你真的了解串口吗(示波器串口波形分析)

    串口是最常用的外设了 xff0c 串口基本都是单片机的标配 串口通信只需要3条线组成 xff0c 分别为RX TX GND 下面将重点分析串口数据帧组成 一 串口通信帧 串口通信帧数据如此 xff0c 每帧由空闲位 起始位 数据位 校验位
  • C++——类和对象(4)

    作者 xff1a 几冬雪来 时间 xff1a 2023年5月6日 内容 xff1a C 43 43 类和对象内容讲解 目录 前言 xff1a 1 运算符重载 xff08 续 xff09 xff1a 2 赋值重载 xff1a 结尾 xff1a