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

news2024/11/18 6:43:44

💖作者:小树苗渴望变成参天大树
❤️‍🩹作者宣言:认真写好每一篇博客
💨作者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了。这个再后面再重点介绍。

四、总结

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

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

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

相关文章

智慧城市3d可视化管理大屏系统有效提高服务质量和效率

随着新一代信息技术飞速融入传统产业&#xff0c;农业数字化、网络化、智能化逐步成为农业现代化发展的基石。实现农业生产环境的智能感知、智能预警、智能决策、智能分析等功能&#xff0c;为农业生产提供精准化保障、高质量运营水平、智能化决策支撑。 3D可视化智慧管理 1&am…

在docker上安装运行Python文件

目录 一、在docker中安装python 1.1 输入镜像拉取命令 1.2 查看镜像 1.3 运行 1.4 查看是否成功 1.5 查看python版本 二、运行py文件 2.1准备运行所需文件 2.2 准备文件夹 2.3 大概是这幅模样 2.4 打包上传到服务器上 2.5 构建镜像示例 2.6 查看镜像 2.7 优化镜像的…

微星GT77HX-13VI2023原厂Windows11重建F3一键恢复

MSI微星系列原厂预装正版系统恢复镜像有原机所有驱动&#xff0c;主题&#xff0c;Logo 安装后自动重建f3 msirestore功能 系统带所有驱动以及msi center小红龙 恢复至出厂状态 文件地址https://pan.baidu.com/s/1snKOsH3OMl3GZLqeAf-GLA?pwd8888 其他型号: 微星 GE76-12代…

lua | 数组与迭代器的使用

目录 一、数组 一维数组 多维数组 二、迭代器 泛型for迭代器 无状态的迭代器 多状态的迭代器 本文章为笔者学习分享 学习网站&#xff1a;Lua 基本语法 | 菜鸟教程 一、数组 数组&#xff1a;相同数据类型的元素按一定顺序排列的集合&#xff0c;可以是一维数组和多维数…

就业Android倒数第二,IOS稳居倒数第一

在如今的互联网大环境下&#xff0c;相信有很多人都在为找工作而感到焦虑&#xff0c;每一投上十几份简历&#xff0c;收到的面试通知也就那么一两家&#xff0c;而且收到面试通知的都是一些小企业&#xff0c;工资低就不是很想去&#xff0c;工资高的岗位看了一下要求感觉自己…

解决uniapp在js文件中使用国际化报错问题

uniapp js 中如何使用国际化&#xff1f; 文章目录 uniapp js 中如何使用国际化&#xff1f;main.js 配置遇到问题解决方案Demo方式一&#xff1a;异步加载模块Promise 写法await写法 方式二&#xff1a;局部引入方式三&#xff1a;按需导入 main.js 配置 main.js 引入并初始化…

Python——pyqt5的计算器(源码+打包)

目录 一、效果图 二、源码 三、如何打包 四、如何减小打包程序大小&#xff08;方法1&#xff09; 五、如何减小打包程序大小&#xff08;方法2&#xff09; 学习视频 一、效果图 只是单纯的练手&#xff0c;然后再学习一下如何打包 二、源码 calculator_UI.zip - 蓝奏云…

论文阅读《Centralized Feature Pyramid for Object Detection》

论文地址&#xff1a;https://arxiv.org/pdf/2210.02093.pdf 源码地址&#xff1a;https://github.com/QY1994-0919/CFPNet 概述 特征金字塔模块在众多计算机视觉任务中都有优异的性能表现。针对现有的方法过渡关注于层间的特征交互而忽略了层内的特征交互的问题&#xff0c;本…

药物分子虚拟筛选规则

药物分子虚拟筛选规则 Lipinski Rule RO5是辉瑞公司资深药物化学家Christopher A. Lipinski在1997年提出&#xff0c;虽然随时代发展虽然其适用范围逐渐变窄&#xff0c;但仍然非常有参考意义。其主要内容如下&#xff1a; 分子量(Mw)小于500&#xff1b;氢键供体(HBD)数目小…

matlab 对线路板进行裁剪

缺陷图像目前还没有搞定————&#xff08;无奈&#xff09; test1 %Sobel方法 I imread(ChuanJian0.jpg); G rgb2gray(I); E1 edge(G, sobel); figure, subplot(2,2,1); imshow(I); title(Original Color Image); subplot(2,2,2); imshow(E1); title(Sobel Edge);E2 ed…

使用PyTorch构建神经网络,并计算参数Params

文章目录 使用PyTorch构建神经网络&#xff0c;并计算参数Params举例计算具有全连接层的神经网络的参数数量计算卷积神经网络的参数数量Params计算过程 总结 使用PyTorch构建神经网络&#xff0c;并计算参数Params 在深度学习中&#xff0c;模型的参数数量是一个非常重要的指标…

零基础学Java好找工作吗?好程序员告诉你入行Java有多惨?

为什么小源建议普通背景、零基础的大专生、本科生去学java编程呢&#xff1f; 因为真的香啊&#xff01;小白容易上岸&#xff0c;而且工作3年的话&#xff0c;基本年薪就能到50w&#xff08;只要你工作后也一直不断努力学习&#xff09;。java岗位属于技术岗&#xff0c;没有任…

Android进阶:Activity的生命周期和启动模式

Activity的生命周期和启动模式 作为Android四大组件之中存在感最强的组件&#xff0c;Activity应该是我们在学习Android中第一个碰到的新概念。在日常开发过程中我们肯定会用到Activity&#xff0c;但是关于Activity的一些细节问题运行机制我们可能还有一些不清楚的问题。今天…

调用百度文心AI作画API实现中文-图像跨模态生成

作者介绍 乔冠华&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2020级硕士研究生&#xff0c;张宏伟人工智能课题组。 研究方向&#xff1a;机器视觉与人工智能。 电子邮件&#xff1a;1078914066qq.com 一&#xff0e;文心AI作画API介绍 1. 文心AI作画 文…

全开源ChatGPT聊天机器人商业版源码/支持魔改/完全开放源代码

&#x1f388; 限时活动领体验会员&#xff1a;可下载程序网创项目短视频素材 &#x1f388; ☑️ 品牌&#xff1a;ChatGPT ☑️ 语言&#xff1a;PHP ☑️ 类型&#xff1a;ChatGPT ☑️ 支持&#xff1a;PCWAP &#x1f389; 有需要的朋友记得关赞评&#xff0c;需要的底部获…

C++哈希

目录 一、认识哈希表 1.unordered_set和unordered_map 2.哈希表的概念 二、闭散列哈希表的实现 1.底层本质 &#xff08;1&#xff09;哈希表的存储结构 &#xff08;2&#xff09;元素的插入与查找 &#xff08;3&#xff09;哈希冲突 &#xff08;4&#xff09;负载…

深入浅出C++ ——线程库

文章目录 线程库thread类的简单介绍线程函数参数原子性操作库 mutex的种类std::mutexstd::recursive_mutexstd::timed_mutexstd::recursive_timed_mutex lock_guard与unique_locklock_guardunique_lock condition_variable 线程库 thread类的简单介绍 在C11之前&#xff0c;涉…

“广东省五一劳动奖章”获得者卫晓欣:“她”力量让新兴技术更获认可

近日&#xff0c;2023年广东省庆祝“五一”国际劳动节暨五一劳动奖表彰大会顺利召开&#xff0c;大会表彰了2023年全国和省五一劳动奖、工人先锋号代表。 其中&#xff0c;来自FISCO BCOS开源社区产业应用合作伙伴广电运通的创新中心总监卫晓欣&#xff0c;凭借在区块链领域的…

分布式锁Redisson对于(不可重入、不可重试、超时释放、主从一致性)四个问题的应对

文章目录 1 Redisson介绍2 Redisson快速入门3 Redisson可重入锁原理4 Redisson锁重试和WatchDog机制5 Redisson锁的MutiLock原理 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中&#xff…

Ai作图可控性演进——从SD到MJ

背景 Ai作图从Diffusion模型开始&#xff0c;作图进入稳步发展快车道。然后用过diffusion系列作图的同学对产图稳定性&#xff0c;以及可控性都会颇有微词。diffusion系列作图方法在宏观层面上确实能够比较好的做出看上去还不错的图。然后当你细抠细节时候&#xff0c;发现这东…