类和对象中(2)

news2024/9/28 19:16:40

在这里插入图片描述

文章目录

  • 一、运算符重载
    • 1、运算符重载出现的原因
    • 2、在全局和类里实现运算符重载
    • 3、赋值运算符重载
      • 1、为什么赋值运算符重载不能写在全局 ?
      • 2、什么时候需要自己实现赋值运算符重载 ?
    • 4、前置++和后置++重载
    • 5、运算符重载的优势
  • 二、const成员函数
    • 1、两个常见const权限放大错误样例
    • 2、const成员函数优势

一、运算符重载

1、运算符重载出现的原因

  在C语言中,我们只能比较用 > 、 < 、 = >、<、= ><=来比较内置类型的大小,而自定义类型的大小却无法比较。对此,C++为了增强代码的可读性引入了运算符重载。运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

格式:
关键字operator后面接需要重载的运算符符号
函数原型:返回值类型 + operator操作符(参数列表)

并不是所有的运算符都能重载

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

2、在全局和类里实现运算符重载

  当我们写成全局函数时,要把类里面的_year等成员变量设置为公有,在类外面才能访问到。这里会发现运算符重载成全局的就需要成员变量是公有的,那么问题来了,封装性如何保证?这里其实可以用我们后面学习的友元解决

放在类里实现:

3、赋值运算符重载

1、为什么赋值运算符重载不能写在全局 ?

  赋值运算符重载和别的运算符重载又有所差异;我们写代码的时候有连续赋值的操作,因此赋值运算符重载必须返回*this

格式:
参数类型:const T&,传递引用可以提高传参效率
返回值类型:T&,返回引用可以提高返回的效率,返回*this:要符合连续赋值的含义
检测是否自己给自己赋值

  赋值运算符如果不显式实现,编译器会生成一个默认的。此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数

2、什么时候需要自己实现赋值运算符重载 ?

  用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。注意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值。即如果类中未涉及到资源管理,赋值运算符是否实现都可以;一旦涉及到资源管理则必须要实现

4、前置++和后置++重载

  前置++返回+之后的值,后置++返回+之前的值,那么前置++和后置++如何构成重载呢 ?
  C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递,前置++可以返回引用,而后置的临时变量temp不能返回引用

5、运算符重载的优势

优势:
1、使得程序的可读性更强:通过运算符重载,可以在类中实现对于运算符的自定义操作,使得程序代码更加简洁、直观,符合人们的习惯,从而增强了程序的可读性。
2、实现程序的通用性和泛化:通过运算符重载,可以将一些类似的操作进行统一化处理,从而实现程序的通用性和泛化,避免了程序中出现大量重复的代码,提高了程序的可维护性和可扩展性。
3、提高程序的效率:通过对运算符的重载,可以在不增加程序复杂度的情况下,提高程序的效率,从而提高程序的运行速度。
4、实现程序的自然性和可读性:运算符重载可以使程序更加接近人类的自然语言,从而使得程序更加易于理解和调试。

二、const成员函数

  将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改

1、两个常见const权限放大错误样例

错误样例1:

  当我们实现某个功能而不需要修改this指针时,我们可以用const修饰this指针,可是this指针不允许显示传递因此我们只能像下面这样加一个const

语法:
void Display() const

  权限可以缩小,却不能放大,因此当外面不需要修改this指针时,我们应该尽量加上const对this进行修饰,以避免出现以下这种情况
错误样例2:

2、const成员函数优势

优点:
1、声明一个成员函数为const可以确保该函数不会修改对象的数据成员,从而提高程序的健壮性和安全性。
2、const成员函数可以被const对象调用,从而限制了对const对象的非法操作,保护了对象的数据成员不被意外修改。
3、const成员函数可以被重载,使用不同的const成员函数可以访问对象的不同成员变量或执行不同的操作,提高程序的灵活性。

总结:
  欢迎阅读小白的文章,如有错误,请严厉指出。下一篇博客我们将用这篇博客的知识实现日期类,期待我们下一篇博客见面!!!

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

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

相关文章

GNN与MLP:GNN是一种泛化器

图神经网络&#xff08;GNN&#xff09;作为图表示学习的模型&#xff0c;建立在MLP架构之上&#xff0c;具有额外的消息传递&#xff0c;以允许特征在节点之间流动。作者通过引入一个被称为P-MLP的中间模型&#xff0c;将GNN性能增益的主要来源定位为其内在的泛化能力&#xf…

JSR303统一校验和分组校验及常用注解@NotBlank@NotEmpty 的使用

JSR303-bean校验规范 JSR303常用注解&#xff0c;下面注解在JavaBean的字段上使用&#xff0c;必须在方法上搭配Vaild才会开启校验&#xff0c;也可以设置分组校验 Null 必须为空 主键字段常用&#xff0c;可以规定新增时字段必须为空NotNull 不能为null 添加数字时使用常用&…

前端学习笔记:CSS中浮动的原理,定位

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育 目录 1、float1.1、float设计的初衷1.2、浮动的原理&#xff0c;类似两个图层1.3、浮动的原理&#xff0c;两个图层的特殊性1.4、消除浮动的影响 2、定位2.1、相对定位&#xff08;relative&#xff09;2.2、绝对定…

CSS var()的使用

最近在做流量对比的功能&#xff0c;有如下的效果图&#xff0c;当某个节点失败的时候&#xff0c;点击能够弹出对应的提示信息。 这个库使用的是jenkins-pipeline 的库&#xff0c; 但是由于它原本的提示框比较糟糕&#xff0c;所以我们想结合antd的tooltip进行展示&#xff0…

CM211-1-ZG-当贝纯净桌面-线刷固件包-

CM211-1-ZG-当贝纯净桌面-线刷固件包-内有教程及短接点 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软件&#xff0c;运…

设计模式之【工厂模式】,创建对象原来有这么多玩法

文章目录 一、什么是工厂模式1、工厂模式的意义2、什么时候应该用工厂模式 二、简单工厂模式1、实例&#xff08;1&#xff09;使用简单工厂进行优化&#xff08;2&#xff09;静态工厂&#xff08;3&#xff09;使用map来去除if&#xff08;4&#xff09;使用反射&#xff08;…

.netCHARTING Crack,添加圆角半径控制

.netCHARTING Crack,添加圆角半径控制 直角或直线组织连接线-通过默认情况下以直角绘制组织连接线&#xff0c;增强了组织连接线的显示方式。可以使用直线选项更改此默认设置&#xff0c;并直接在点之间绘制连接线。 同步组织节点的宽度和高度-添加了Element.Annotation.SyncWi…

Vue3+element-plus实现后台管理系统

背景&#xff08;未完待续&#xff09; 环境&#xff1a;node.js软件 、Vs code、vite、elemnt-plus、windicss(样式框架&#xff09; 第一节课 1、首先&#xff0c;使用npm 命令构建项目&#xff08; vscode安装的插件 vscode中文显示插件 2、高亮提示插件volar 3、vue 3 …

【Ansys Fluent】根据export导出的ASCII文件按坐标和物理量之间的关系重建物理场(温度场、压力场等)

一、问题说明 在fluent中利用export功能导出ASCII格式的文件&#xff0c;例如下面的文件&#xff0c;第2-4列是单元中心坐标值&#xff0c;第5列是温度值。 如果给出和「导出这个ASCII数据文件时用的几何模型尺寸」一致或等比例放缩的几何模型&#xff0c;可否根据这个ASCII文…

【PCIE体系结构八】数据链路层是如何保证TLP的正确传输的?

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考书籍&#xff1a;《深入浅出SSD&#xff1a;固态存储核心技术、原理与实战》 目…

kafka3.x详解

kafka 一、简介1.1、场景选择&#xff0c;与其他mq相比1.2、应用场景1.2.1、流量消峰1.2.2、解耦1.2.3、异步通讯 1.3、消息队列的两种模式1.3.1、点对点模式1.3.2、发布/订阅模式 1.4、Kafka 基础架构 二、安装部署2.1、安装包方式2.2、docker安装方式2.3、docker安装kafka-ma…

RuoYi-Cloud-Plus 登录过程源码

登录界面 ruoyi-ui/src/views/login.vue 点击登录按钮进入handleLogin方法 handleLogin() {//验证数据是否合法this.$refs.loginForm.validate(valid > {if (valid) {this.loading true;//如果记住密码被勾选if (this.loginForm.rememberMe) {//直接在cookie中存入相关信…

面试也要说人话

整理了一些读者的问题。 什么是《面试1v1》&#xff1f; 《面试1v1》是一个以对话形式讲解知识点的文章合集&#xff0c;是由 JavaPub 编写的真人1对1面试对话教程&#xff0c;通过真实案例编写&#xff0c;生动、有趣、干货满满。 为什么要写《面试1v1》这个专题&#xff1…

排序篇:归并排序的递归,非递归以及计数排序的实现(C语言)

目录 一&#xff1a;归并排序 (1)归并排序的基本思想 (2)递归版本 ①实现思路 ②合并 ③递归实现有序 ④最终代码 (3)非递归版本 ①实现思路 ②控制分组 ③最终代码 (4)时间&#xff0c;空间复杂度分析 (5)小结 二&#xff1a;计数排序 (1)计数排序的基本思想 …

asp.net+sqlserver体育器材租赁借还系统

本器材借还系统分为管理员和用户两部分&#xff0c;具体功能如下 管理员部分功能 1.管理员管理&#xff0c;管理系统内所有的管理员信息 2.器材信息管理&#xff0c;对器材的基本信息进行管理&#xff0c;方便用户的租借 3.申请审核管理&#xff0c;当用户申请了器材的使用只&a…

跨境卖家必看系列:沃尔玛美国站入驻教程

沃尔玛自从2020年开始重点发展线上商店以来&#xff0c;销售额一直都很可观。前段时间&#xff0c;沃尔玛美国电商还开了个全球招商战略发布会。所以今天龙哥就根据会议官方发布的步骤&#xff0c;给大家总结一下想要入驻沃尔玛美国站的话需要怎么操作。 沃尔玛的入驻渠道 1.…

35-40的技术人员为什么会被“不友好”,请你们自身反思-拒做职场的“嗯嗯”怪

35-40真的是IT人员的一道坎吗&#xff1f; IT技术做不到35-40&#xff0c;可是我身边有大量35-40事业发达、职业发展更好的朋友。同时&#xff0c;我身边也有大量35-40被“毕业”的人更多。 本人经过7年来先后带队过3个大型研发团队&#xff0c;最少的也有60-70号人。最多的达到…

谈谈MySQL的InnoDB存储引擎

大家好&#xff0c;我是易安&#xff01; 今天我们谈一谈MySQL中InnoDB存储引擎。InnoDB存储引擎作为我们最常用到的存储引擎之一&#xff0c;充分熟悉它的的实现和运行原理&#xff0c;有助于我们更好地创建和维护数据库表。 InnoDB体系架构 InnoDB主要包括了内存池、后台线程…

【深入浅出 Yarn 架构与实现】6-3 NodeManager 分布式缓存

不要跳过这部分知识&#xff0c;对了解 NodeManager 本地目录结构&#xff0c;和熟悉 Container 启动流程有帮助。 一、分布式缓存介绍 主要作用就是将用户应用程序执行时&#xff0c;所需的外部文件资源下载缓存到各个节点。 YARN 分布式缓存工作流程如下: 客户端将应用程序…

电脑——如何配置一台电脑

一、需要买那些东西 主板&#xff1a;显卡、电源、CPU、内存条、硬盘、显示器、鼠标、键盘、音响 怎么开始&#xff1f; 知乎黑虾 首先确定CPU型号再选择与该CPU兼容的主板&#xff08;不同的CPU对应的主板插槽类型是不同的&#xff09; 如何选择CPU型号&#xff1a; 主要…