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

【C++】-对于自定义类型的输入输出运算符重载

💖作者:小树苗渴望变成参天大树
❤️‍🩹作者宣言:认真写好每一篇博客
💨作者gitee:gitee
💞作者专栏:C语言,数据结构初阶,Linux,C++

文章目录

  • 前言
  • 一、案例引入
  • 二、<<的重载
  • 三、>>的重载
  • 四、总结


前言

今天根据上篇讲的日期类的实现,来简单的讲解一下大概怎么重载输入输出运算符,其他类也可以参考这个方法来使用这个,那我们开始进入正文的讲解


一、案例引入

接上一篇,我们写了好多运算符重载,我们将结果用一个成员函数给打印出来了
在这里插入图片描述
对于C++我们的输入输出使用的都是cin和cout,因为他能实现对内置类型的输入输出很方便,对于自定义类型我们需要使用成员函数,对象再来调用就显得格格不入,想要实现像内置类型的那种我们就需要进行运算符重载,这样就可以直接使用cin和cout.

二、<<的重载

我们真正需要重载的是流插入和流提取运算符,cout只是他其中的一个操作数,我们目前想要实现的效果是这样的:

cout<<d1;

类似于:

d1+d2;

这样的二元运算符只有两个操作数

我们再来写一个类:

class date 
{
public:date(int year = 1, int month = 1, int day = 1)//全缺省的构造函数{_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};

我们的cout和cin分别再类osream和istream类里面,所以我们每次都需要导入
< iostream>和std的展开
在这里插入图片描述

我们再按照之前运算符的写法再类里试着重载一下流插入:

void operator<<(ostream& cout)
{cout << _year <<"年" << _month <<"月" << _day <<"日" << endl;//这是内置类型所以可以直接这么写
}

在这里插入图片描述
这样居然不行,原因是运算符的左操作数默认传给隐藏的this,我们按照下面这么些就可以了

d1<<cout;

但是这么写太别扭了,我们只能将这个函数写成全局的了,传两个参数就好了:

void operator<<(ostream& cout, const date& d)
{cout << d._year << "年" << d._month << "月" << d._day << "日" << endl;
}

在这里插入图片描述
这样写访问不了成员变量,有两种解决办法
==1.==使用函数将成员变量返回出来
在这里插入图片描述

在这里插入图片描述

==2.==使用友元函数
在这里插入图片描述
在这里插入图片描述

大家有没有发现我们使用第一种和第二种的时候,第二个参数有的加了const,有的没加,原因就是要理解隐含指针的类型,以此类为例,隐含的this类型是date*,而这个是对象的地址,对象加const那么取地址之后的类型应该为const date*,当你第一种方法加const,那d.getyear(),就相当于d.getyear(const date*d),而getyear()成员函数的参数类型应该是date*的,所以出现参数不匹配的情况会报错,像要解决这个问题,要不去点const,要不再成员函数前面加const修改就行了,调用内置类型就不会出现这样的问题。

下篇写类和对象中篇完结的时候我在重点讲解一下,需要再理解我写的C++入门这篇博客关于引用的知识点,const修饰的变量,引用怎么使用,把那个弄懂,应该问题不大

但是这个写的还不是特别完美,我们想要达到像输出内置类型那样,一次输出多个数据

cout<<d1<<d2<<d3;

在这里插入图片描述
我们想要达到上面这种效果就要知道为什么可以这么写,再之前连续赋值的运算符那一块,我讲过是从有往左赋值,有返回值,那么对于这个是从左往右返回值应该为cout的类型,不然没办法往右运行

ostream& operator<<(ostream& cout, const date& d)
{cout << d._year << "年" << d._month << "月" << d._day << "日" << endl;return cout;
}

我这里是通过友元来访问成员变量的,因为cout也是对象,出来函数体没有被销毁,所以可以使用引用返回。

说明:对于第一个参数,我为什么没有加const修饰,原因是这是流插入运算符,往cout里面插入数据,所以不能使用从const修饰。

三、>>的重载

我们刚才讲解了流插入运算符,现在按照上面的函数,来写流提取操作符,这个也要写成全局函数,使用友元函数,上面一样的道理,也可以连续输入好几个数据,也有返回值,cin是类istream的对象,我们来看看具体函数形式

istream& operator>>(istream& cin, date& d)
{cin >> d._year >> d._month >> d._day;return cin;
}

第二参数不加入const大家应该明白,第一个参数,刚才说对于流插入,是不用加,但是这里是流提取为什么也不需要加const呢??原因是,cin里面有的数据也还是会发生改变的,不是完全不变的,所以不加const。

对于日期类,我们再上篇也讲过有的日期输入不合理,再上面我们会修改构造函数里面的内容,加一个判断就好了,这里也是一样的,但有一个细节要注意:

istream& operator>>(istream& cin, date& d)
{int year, month, day;cin >> year >> month >> day;if (day > 0 && day <= date::getmonthday(year, month)&&month>0&&month<13){d._year = year;d._month = month;d._day = day;}else{cout << "非法输入" << endl;}return cin;
}

注意的点就是,我们再之前写过一个获取月份天数的函数,但是睡哦可以写成全局也可以写在类里面,对于写在全局的可以直接调用,但是写在类里面必须使用对象名去调用,也可以再函数前面加一个static来使用类名来调用,加static那么就没有隐藏的this了。这个再后面再重点介绍。

四、总结

对于这个重载好多类都是可以参照这个来写,里面的内容可能要调整,根据具体的类来写,这里面的友元函数我在类和对象下篇会再具体介绍的,这里也相当于铺垫了,大家现在不懂没有关系,知道就行了,我们今天这篇博客不难,就是细节比较多,大家要注意好,我们下篇再见
在这里插入图片描述

相关文章:

【C++】-对于自定义类型的输入输出运算符重载

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树 ❤️‍&#x1fa79;作者宣言&#xff1a;认真写好每一篇博客 &#x1f4a8;作者gitee:gitee &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 文章目录 前言一、案例引入二、<<的重载三、>>的…...

(详解)js中什么是宏任务、微任务?宏任务、微任务有哪些?又是怎么执行的?

目录 参考资料 必看强烈建议十分钟看完视频 &#xff0c;即可学会 必看参考详解宏任务微任务 笔记 宏任务与微任务 定时器的任务编排 promise的微任务处理逻辑 DOM渲染任务 任务队列共享内存 进度条的实现 任务拆分成多个任务 promise复杂任务分割 img算同步还是异步…...

Okta 即代码:云原生时代的身份管理

我们为什么应该将 Okta 配置作为代码进行管理&#xff1f; 对于需要跨多个应用程序和环境管理对其数字资源的访问的组织来说&#xff0c;Okta 可能是最受欢迎的选择&#xff0c;因为它提供了一系列使其在身份验证和授权方面很受欢迎的功能&#xff0c;例如&#xff1a; 单点登…...

数据结构(六)—— 二叉树(7)构建二叉树

文章目录 如何使用递归构建二叉树1、创建一颗全新树&#xff08;题1-5&#xff09;2、在原有的树上新增东西&#xff08;题6&#xff09; 1 106 从 后序 与 中序 遍历序列构造二叉树2 105 从 前序 与 中序 遍历序列构造二叉树3 108 将有序数组转换为二叉搜索树&#xff08;输入…...

安装适用于Linux的Windows11子系统(WSL2)

1. 主板BIOS开启虚拟化 开启虚拟化需要在BIOS中进行设置&#xff0c;进入主板BIOS→找到虚拟化设置→开启。 2. 检验是否开启虚拟化 打开Windows命令行&#xff0c;并运行 systeminfo固件中已启用虚拟化为是&#xff0c;代表主板BIOS已经开启虚拟化。 3. 启用Windows功能…...

使用Spring的五大类注解读取和存储Bean

目录 1.存储Bean对象的注解 1.1 五大类注解 1.2 方法注解 1.3添加注解的依赖 2.注解的使用 2.1 controller注解 2. 2Service注解 2.3.Resopsitory注解 2.4Component注解 2.5Configuration注解 2.6 注解之间的关系 3.方法注解 3.1 方法注解要配合类注解来使用。 3.2…...

Vue3通透教程【十一】初探TypeScript

文章目录 🌟 写在前面🌟 TypeScript是什么?🌟TypeScript 增加了什么?🌟TypeScript 初体验🌟 写在最后🌟 写在前面 专栏介绍: 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 Vue3 的相关技术文章,Vue 框架目前的地位大家应该都晓得,所谓…...

Linux环境安装iperf3(网络性能测试工具)

[rootlocalhost ]# yum search iperf 已加载插件&#xff1a;fastestmirror Loading mirror speeds from cached hostfile* base: mirrors.tuna.tsinghua.edu.cn* extras: mirrors.huaweicloud.com* updates: mirrors.tuna.tsinghua.edu.cnN/S matched: iperf iperf3-devel.i6…...

回顾第一章

回顾 Shell脚本中的$虚函数虚函数和纯虚函数 git merge/rebasegit merge特点git rebase特点 Linux内核调试——coredump获取core dump 深度测试和模板测试2D游戏的制作思路C11特性 Shell脚本中的$ ​ $0: 脚本自身的名称&#xff1b; $1: 传入脚本的第一个参数&#xff1b; $2…...

Jupyter Notebook入门教程

Jupyter Notebook&#xff08;又称Python Notebook&#xff09;是一个交互式的笔记本&#xff0c;支持运行超过40种编程语言。本文中我们将介绍Jupyter Notebook的主要特点&#xff0c;了解为什么它能成为人们创造优美的可交互式文档和教育资源的一个强大工具。 首先&#xff…...

独立按键识别

项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第四章 IO口编写 参考图电路编写程序&#xff0c;要求实现如下功能: 开始时LED均为熄灭状态&#xff0c;随后根据按键动作点亮相应LED(在按键释放后能继续保持该亮灯状态&#xff0c;直至新的按键压下时为止…...

【论文阅读】AlphaFold2阅读笔记

摘要 给一串氨基酸的序列&#xff0c;去预测他的结构是什么样的 蛋白质的折叠问题 alphaFold精度不够 这里可以达到原子精度的预测 CASP14 精度 这个是什么问题是不是解决了问题 模型的结果并不重要 导论 摘要故事的详细版本 在写论文的时候&#xff0c;可以这样写&a…...

机器学习基础知识之数据归一化

文章目录 归一化的原因1、最大最小归一化2、Z-score标准化3、不同方法的应用 归一化的原因 在进行机器学习训练时&#xff0c;通常一个数据集中包含多个不同的特征&#xff0c;例如在土壤重金属数据集中&#xff0c;每一个样本代表一个采样点&#xff0c;其包含的特征有经度、…...

QCC51XX---pydbg_cmd集合

目录 common pydbg_cmd headset pydbg_cmd earbud pydbg_cmd common pydbg_cmd log apps1.log_level() apps1.fw.gbl.debug_log_level__global 查看log等级apps1.fw.gbl.debug_log_level__global.value = 5 设置log等级 apps1.log()...

camx 马达的MSM_ACTUATOR_WRITE_DAC 操作

camx 马达的MSM_ACTUATOR_WRITE_DAC操作 为什么要分析 MSM_ACTUATOR_WRITE_DACmm-camera MSM_ACTUATOR_WRITE_DACcamx MSM_ACTUATOR_WRITE_DAC总结 为什么要分析 MSM_ACTUATOR_WRITE_DAC 目前的camx源码 省略了hw_mask 的处理。 一般来说 hw_mask 是0 &#xff0c;但是对于非0…...

【无人机】无人机平台的非移动 GPS 干扰器进行位置估计的多种传感器融合算法的性能分析(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …...

一篇文章搞定《RecyclerView缓存复用机制》

------《RecyclerView缓存复用机制》 前言零、为什么要缓存一、RecyclerView如何构建我们的列表视图二、缓存过程三、缓存结构1、mChangedScrap/mAttachedScrap2、mCachedViews3、mViewCacheExtension4、mRecyclerPool 四、总结 前言 本篇文章&#xff0c;暂时不加入预加载进行…...

Elasticsearch概述

1.Elasticsearch干啥的&#xff1f; Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;用于实时搜索、分析和存储大规模数据。它可以帮助用户在海量数据中快速进行全文搜索、聚合分析、地理空间分析等操作&#xff0c;并支持水平扩展以应对高并发访问需求。 Elasti…...

停车场收费系统

1.系统的开发工具 1.1 AppServe集成应用 Mysql&#xff1a;MySQL 是一款安全、跨平台、高效的&#xff0c;并与 PHP、Java 等主流编程语言紧密结合的数据库系统。该数据库系统是由瑞典的 MySQL AB 公司开发、发布并支持&#xff0c;由 MySQL 的初始开发人员 David Axmark 和 Mi…...

nodejs+vue+elementui学生毕业生离校系统

学生毕业离校系统的开发过程中。该学生毕业离校系统包括管理员、学生和教师。其主要功能包括管理员&#xff1a;首页、个人中心、学生管理、教师管理、离校信息管理、费用结算管理、论文审核管理、管理员管理、留言板管理、系统管理等&#xff0c;前台首页&#xff1b;首页、离…...

儿童用灯哪个品牌好?推荐专业的儿童护眼台灯

一款好的儿童台灯&#xff0c;主要是从5个方面决定&#xff0c;照度及均匀度&#xff0c;蓝光&#xff0c;色温&#xff0c;显指&#xff0c;频闪 ① 照度及均匀度最高是国AA级&#xff0c;其次就是国A级 ② 蓝光一定要选择RG0无危险级&#xff0c;蓝光能量最强&#xff0c;…...

探究Android插件化开发的新思路——Shadow插件化框架

Shadow插件化框架是什么&#xff1f; Shadow是一种Android App的插件化框架&#xff0c;它利用类似于ClassLoader的机制来实现应用程序中的模块化&#xff0c;并让这些模块可以在运行时灵活地进行加载和卸载。Shadow框架主张将一个大型的Android App拆分成多个小模块&#xff…...

SimpleDateFormat和DateTimeFormatter的区别及使用详解

目录 1.简介2.区别3.SimpleDateFormat3.1 字符串转日期3.2 日期转字符串 4.DateTimeFormatter4.1 字符串转日期4.2 日期转字符串 扩展 1.简介 DateTimeFormatter 和 SimpleDateFormat 都是用于格式化日期和时间的类&#xff0c;但是它们有一些区别。 SimpleDateFormat 是 Jav…...

边缘人工智能——nanodet模型实践指引,从标注数据集到实现部署文件

内容概述 首先获得一个合适的nanodet模型版本&#xff0c;配置nanodet适用的环境&#xff0c;然后对网上公开的生数据集进行重新标注&#xff0c;配置nanodet并进行训练&#xff0c;.pth到.onnx的模型转化及简化&#xff0c;编写推理文件。 文章着重于实践方向指引&#xff0c;…...

SASS的用法指南

一、什么是SASS SASS是一种CSS的开发工具&#xff0c;提供了许多便利的写法&#xff0c;大大节省了设计者的时间&#xff0c;使得CSS的开发&#xff0c;变得简单和可维护。 本文总结了SASS的主要用法。我的目标是&#xff0c;有了这篇文章&#xff0c;日常的一般使用就不需要去…...

MCSM面板一键搭建我的世界服务器-外网远程联机【内网穿透】

文章目录 前言1.Mcsmanager安装2.创建Minecraft服务器3.本地测试联机4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射内网端口 5.远程联机测试6. 配置固定远程联机端口地址6.1 保留一个固定TCP地址6.2 配置固定TCP地址 7. 使用固定公网地址远程联机 转载自远程穿透文章&…...

( 数组和矩阵) 565. 数组嵌套 ——【Leetcode每日一题】

❓565. 数组嵌套 难度&#xff1a;中等 索引从 0 开始长度为N的数组 A&#xff0c;包含 0 到 N - 1 的所有整数。找到最大的集合 S并返回其大小&#xff0c;其中 S[i] {A[i], A[A[i]], A[A[A[i]]], ... } 且遵守以下的规则。 假设选择索引为 i 的元素 A[i] 为 S 的第一个元…...

linux内核网络子系统初探---概述

linux内核网络子系统初探—概述 一、网络模型 简单介绍 学习网络时&#xff0c;必定能在各种教材资料里见到以下三种网络模型&#xff1a; 三种模型间的差异&#xff1a; OSI七层模型是理论上的网络模型&#xff0c;从功能方面分成了相对独立的7个层次&#xff0c;由于太复…...

java版工程项目管理系统源代码-功能清单 图文解析

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…...

【chapter30】【PyTorch】[动量与学习率衰减】

前言&#xff1a; SGD的不足&#xff1a; ①呈“之”字型&#xff0c;迂回前进&#xff0c;损失函数值在一些维度的改变得快&#xff08;更新速度快&#xff09;&#xff0c;在一些维度改变得慢&#xff08;速度慢&#xff09;- 在高维空间更加普遍 ②容易陷入局部极小值和鞍点…...

如何使用二级域名做网站/网络销售培训

本文主要介绍移动和嵌入式系统中的可信计算&#xff0c;包含TCG 与其标准和解决方案、可信平台模块、嵌入式系统安全与可信和硬件安全模块相关内容。 本文来自实验室孙伊凡的学习笔记 移动和嵌入式系统中的可信计算 1.1 背景与现状 标准计算平台的安全性匮乏问题自70年代早期…...

页面设计优缺点/北京seo做排名

http://www.brickcom.com/products/DetailView.php?modelnameCMS-Client&seriesCMS#product-support http://ihomeapp.cn/dl_files/CMSClient-manual.pdf转载于:https://www.cnblogs.com/fx2008/p/5999035.html...

国内做免费视频网站有哪些/浙江seo推广

本篇文章我们来讲讲如何对MySQL数据库进行更新操作&#xff0c;对数据库进行增删改查操作是我们必会的基础之一&#xff0c;会了这个增删改查我们可以在这基础上去编写更多的东西&#xff0c;废话不多说了&#xff0c;我们来看一下本篇文章的内容吧&#xff01;1、第一种&#…...

做一网站困难吗/百度搜索官网

查看演示 下载皮肤文件 对应Cs Tip09, 我就有一个测试的Cs站点, 完全重写了了Cs的皮肤文件 还有一个Css Hack <!--[if IE 5]> <style typetext/CSS> <!-- #content{width: 540px;} #sidebar-a{width: 220px;} //--> </style> <![endif]--> 原因参…...

dw软件做的东西怎么在网站用/营销网站建设哪家快

2019独角兽企业重金招聘Python工程师标准>>> 队列&#xff1a;先进先出 栈&#xff1a;先进后出; 实现栈&#xff1a;有队列1有队列2。实现原理&#xff0c;始终保持一个队列为空队列。取元素时&#xff0c;将不为空的队列所有元素减一全部放入另外一个队列。将最后…...

wordpress 删除表/国产搜什么关键词最好看

本来8号可以过来的&#xff0c;结果because 家home事&#xff0c;不得已晚来了三天。全当报知遇之恩&#xff0c;一天顶一年的了。三年后&#xff0c;再说。三年死合同。 MySQL数据库基础学习&#xff0c; 之前work 用的SqlServer&#xff0c;new company 用的MySQL&#xff0…...