C++流插入和流提取的重载!

news2025/1/12 23:37:50

C++作为C语言的衍生,其弥补了C语言中的很多不足,也对C语言进行了一定的优化!今日就来讲解一下C++中输入/出流相关的知识!以及对输入/出的重载!,希望读完本篇文章,能让读者们对C++中输入/出流有更深一步的认识!


C++流插入/提取的引出

不知道小伙伴们是否注意到,C++中内置类型能直接被iostream流识别,但是自定义类型不能被识别!而且在C++中对一个内置类型输入/出时,不用再像C语言那样,规定输入/出格式!而是编译器自动识别输入输出的格式,这真的是编译器真的自动识别的么?实际上不是的!编译器只是对这些运算符进行重载,然后再对类型匹配的形参进行函数重载匹配正确的函数,那么是否能对自定义类型进行输出/入呢?答案是肯定的,这时就用到了C++中流输出/出的运算符重载!


C++流插入/提取的重载

那么既然能进行运算符重载,那么如果想要一次输入/输出一个类,应该怎么搞呢?对于C++而言,只需要对流插入和流提取进行一下运算符重载就可以实现一次性输入/输出整个类想要输出的成员!下面我就来给大家实现一下对流插入/提取进行重载来实现对类对象的输入/出!

流输出的重载

通过对流输出的重载来实现对类对象的整体输出,代码如下:

class Data
{
	//在类中声明友元函数即可在外部进行访问!!!
    //对于日期类的引用必须要加const进行修饰,不能改变原来的日期类!!!
	friend ostream& operator<<(ostream& out, const Data& a);

public:

	//构造函数!
	Data(int year,int month,int day)
	{
		cout << "Data()" << endl;
		_year = year;
		_month =  month;
		_day = day;
	}
	//析构函数!!
	~Data()
	{
		;
	}
private:
	int _year;
	int _month;
	int _day;
};


//void operator<<(ostream& out, const Data& a)
//{
//	//利用友元函数来对类中的私有成员进行访问!!
//	out << a._year << "/" << a._month << "/" << a._day << endl;
//}
int main()
{
	Data d1(2023,9,21);
	cout << d1;

}

我们还是以简单的日期类来举例子,如果我们想要对类中的若干成员进行输出时,那么此时我们需要对流输出进行运算符重载!

但是需要注意的是:只能在类外进行声明定义,不能在类内定义,因为在类内定义时,函数会自动省略一个this指针,又因为<<操作符是基于两个变量的,而省略的第一个变量是this指针,若在类内定义时,结果是:this.data<<ostream out,显然是与我们的<<不符,因为输出流是变量流出到控制台,而现在导致的是控制台输出到变量内!显然与原来的顺序构成相反了,所以不能在类内进行定义!

注:对第二个参数日期类的引用时,尽量加上const修饰,因为当对日期类输出时,日期类是不会改变的!所以加上const是一种较安全的做法!!


那么只能在类外定义运算符重载!那么在类外定义运算符重载的时候,需要注意的是:因为在类外,所以对类内的private 成员不能进行访问!!那么该如何解决呢?

1.用友元声明进行声明解决!

2.直接将类中的成员全部声明为public类型成员!

注:能尽量不使用友元声明就不使用,因为使用了友元声明,会破坏了类的封装性!还有可能对数据的保护减弱!

有些眼尖的小伙伴发现,若是想输出多组类!那么返回值类型为void 岂不是行不通了么,对的,这时我们只需要将返回值类型变为(ostream&),即对输出流的引用,就可以实现多组的输出!代码如下:

此时,对流输出的重载已经完成了!


流输入的重载

既然实现了流输出的重载,那么流输入的重载一定也能实现!那么该如何实现呢?是否和流输出的操作一样呢?

其实,流输入的重载与流输出的重载没有什么区别!但是有一点的区别就是日期类的引用不能加上const,因为一旦加上了const编译器就会报错!

会报错没有与操作数匹配的运算符!因为进行输入时,本质上就是对一个变量进行修改,而加上了const就具有了常属性,所以编译器会报错!

流输入的代码如下:

class Data
{
	//在类中声明友元函数即可在外部进行访问!!!
    //进行流输入的时候一定不能加上const,一旦加上const编译器就会报错!!
	friend istream& operator<<(ostream& in,  Data& a);

public:

	//构造函数!
	Data(int year,int month,int day)
	{
		cout << "Data()" << endl;
		_year = year;
		_month =  month;
		_day = day;
	}
	//析构函数!!
	~Data()
	{
		;
	}
private:
	int _year;
	int _month;
	int _day;
};


//void operator>>(istream& in,  Data& a)
//{
//	//利用友元函数来对类中的私有成员进行访问!!
//	in>>a._year>> a._month>>a._day;
//}
int main()
{
	Data d1(2023,9,21);
	cin >> d1;

}

通过对输出流进行简单的修改即可以完成对输入流运算符的重载!


输入/出流重载完整代码

 #define  _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;


//利用函数重载和输入/出流来实现运算符重载!!用来打印类的成员!!

//注意:必须在全局中进行运算符重载!不能在类内定义运算符重载!
//因为类中的运算符重载其省略了第一个参数this指针,但是“<<”又是双操作数操作符!
//有着严格的顺序要求!!所以只能在全局定义运算符重载!!


class Data
{
	//在类中声明友元函数即可在外部进行访问!!!
	friend ostream& operator<<(ostream& out, const Data& a);
	friend istream& operator>>(istream& in, Data& a);

public:

	//构造函数!
	Data(int year,int month,int day)
	{
		cout << "Data()" << endl;
		_year = year;
		_month =  month;
		_day = day;
	}
	//析构函数!!
	~Data()
	{
		;
	}
private:
	int _year;
	int _month;
	int _day;
};


//void operator<<(ostream& out, const Data& a)
//{
//	//利用友元函数来对类中的私有成员进行访问!!
//	out << a._year << "/" << a._month << "/" << a._day << endl;
//}

//输出流运算符重载
ostream& operator<<(ostream& out, const Data& a)
{
	//可以利用友元函数来对类中的私有成员进行访问!!

	out << a._year << "/" << a._month << "/" << a._day << endl;
	return out;
}


//输入流运算符重载!

//当进行输入流重载函数的时候,对类不能加上const修饰!因为一旦加上const修饰类,那么类就无法进行输入!
istream& operator>>(istream& in, Data& a)
{
	//利用友元函数来对类中的私有成员进行访问!!

	in >> a._year >> a._month >> a._day;
	return in;
}
int main()
{
	Data d1(2023,9,21);
	Data d2(2023,9,22);
	Data d3(2023,9,23);
	cout << d1<<d2<<d3;
	cin>>d1;
	cout << d1;

}

好了,今日的输入/出流运算符重载结束了,希望读者们读完文章会有一定的收获,若有错误!也希望读者们提出,笔者必定积极改正!

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

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

相关文章

Java之IO概述以及

1.1 什么是IO 生活中&#xff0c;你肯定经历过这样的场景。当你编辑一个文本文件&#xff0c;忘记了ctrls &#xff0c;可能文件就白白编辑了。当你电脑上插入一个U盘&#xff0c;可以把一个视频&#xff0c;拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢&#xff1f;键…

散列(哈希)查找的定义,常见的散列函数设计以及处理哈希冲突方法

1.散列表 1.散列表的定义 散列表(Hash Table)&#xff0c;又称哈希表。 是一种数据结构&#xff0c;特点是:数据元素的关键字与其存储地址直接相关。 特点&#xff1a; 若不同的关键字通过散列函数映射到同一个值&#xff0c;则称它们为“同义词”。通过散列函数确定的位置…

Maven 设置环境变量(Windows、Linux)

文章目录 Windows 配置 Maven 环境变量Linux 配置 Maven 环境变量 如果想在任意路径下都能通过 mvn 命令运行 Maven 程序&#xff0c;就需要将 Maven 程序路径设置到环境变量中&#xff0c; 否则使用 mvn 命令时每次都要加上 Maven 程序的全路径 核心就一句话&#xff0c;把 M…

坚鹏:中国邮政储蓄银行金融科技前沿技术发展与应用场景第4期

中国邮政储蓄银行金融科技前沿技术发展与应用场景第4期培训圆满结束 中国邮政储蓄银行拥有优良的资产质量和显著的成长潜力&#xff0c;是中国领先的大型零售银行。2016年9月在香港联交所挂牌上市&#xff0c;2019年12月在上交所挂牌上市。中国邮政储蓄银行拥有近4万个营业网点…

学习记忆——英语篇——右脑记忆单词

文章目录 英语字母形象起源右脑记忆单词的原则四大步骤第一步&#xff1a;摄取信息第二步&#xff1a;处理信息第三步&#xff1a;储存信息第四步&#xff1a;提取信息 训练例子字母形象训练 右脑记忆单词5大方法字源法编码法字母编码法字母组合编码法 拼音法全拼法拼音组合 熟…

springcloud3 分布式事务解决方案seata之XA模式4

一 seata的模式 1.1 seata的几种模式比较 Seata基于上述架构提供了四种不同的分布式事务解决方案&#xff1a; XA模式&#xff1a;强一致性分阶段事务模式&#xff0c;牺牲了一定的可用性&#xff0c;无业务侵入 TCC模式&#xff1a;最终一致的分阶段事务模式&#xff0c;有…

操作系统:中断和异常

1.中断的作用 CPU上会运行两种程序&#xff0c;一种是操作系统内核程序&#xff08;是整个系统的管理者&#xff09;&#xff0c;一种是应用程序。 1.中断的特点 在合适的情况下&#xff0c;操作系统内核会把CPU的使用权主动让给应用程序。“中断”是让操作系统内核夺回CPu使…

java智慧园区系统源码 智慧园区小程序源码

java智慧园区系统源码 智慧园区小程序源码 技术框架&#xff1a; 核心框架&#xff1a;Spring Boot 2.4.0 安全框架&#xff1a;JwtPermission 3.1.1 前端&#xff1a;Ant Design Vue 1.6.2 持久层框架&#xff1a;MyBatis-Plus 3.4.1 关系型数据库: Mysql 8.0.22 数据库…

【开发篇】一、热部署

文章目录 1、手工启动热部署2、自动启动热部署3、热部署范围配置4、关闭热部署功能 1、手工启动热部署 日常开发与调试&#xff0c;改几行代码想看效果就得手动点重启&#xff0c;很繁琐&#xff0c;接下来考虑启动热部署。首先引入springboot开发者工具&#xff1a; <dep…

找视频背景音乐素材,就上这6个网站。

找背景音乐、BGM、音效素材&#xff0c;就上这6个网站&#xff0c;国内外都有&#xff0c;免费下载&#xff0c;还可以商用&#xff0c;建议收藏起来~ 1、菜鸟图库 https://www.sucai999.com/audio.html?vNTYwNDUx 菜鸟图库是一个综合性素材网站&#xff0c;站内涵盖设计、图…

ceph分布式存储部署

一、概述 是一个统一的分布式存储系统&#xff0c;设计初衷是提供较好的性能、可靠性和可扩展性。 特点 1、统一存储 虽然 ceph 底层是一个分布式文件系统&#xff0c;但由于在上层开发了支持对象和块的接口。所以在开源存储软件中&#xff0c;能够一统江湖。至于能不能千秋万…

单片机学习--->Keil多文件工程

1、在文件夹中创建新的文件夹 目录&#xff1a; App 文件夹&#xff1a;用于存放外设驱动文件&#xff0c;如 LED、数码管、定时器等。 Obj 文件夹&#xff1a;用于存放编译产生的 c/汇编/链接的列表清单、调试信息、 hex 文件、预览信息、封装库等文件。 Public 文件夹&#x…

D. Edge Split

Problem - D - Codeforces 思路&#xff1a;思路想到了&#xff0c;但是不知道用什么方法写。。首先我们先看只有一个树的情况&#xff0c;那么如果我们所有的边是一个颜色&#xff0c;那么答案是1n&#xff0c;如果我们将其中的一条边变色&#xff0c;那么产生的答案是2n-1&am…

buuctf web [ACTF2020 新生赛]Upload

明了但不明显的文件上传 传个试试 行&#xff0c;抓包吧&#xff0c;php格式不行&#xff0c;就先上传要求的格式&#xff1a;jpg、png、gif 抓到上传的包之后&#xff0c;再修改成我们想要的 常见的php格式绕过有&#xff1a;php,php3,php4,php5,phtml,pht 挨个试试 这是上个…

Python 根据身高体重计算体质(BMI)指数

""" 根据身高体重计算体质(BMI)指数知识点&#xff1a;1、计算公式&#xff1a;体质指数(BMI) 体重(KG) / (身高(M) * 身高(M))2、变量类型转换3、运算符幂**&#xff0c;例如&#xff1a;3 ** 2 9 <> 3 * 34、更多的运用请参考&#xff1a;https://blo…

基于矩阵分解算法的智能Steam游戏AI推荐系统——深度学习算法应用(含python、ipynb工程源码)+数据集(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow环境PyQt5环境 模块实现1. 数据预处理 相关其它博客工程源代码下载其它资料下载 前言 本项目采用了矩阵分解算法&#xff0c;用于对玩家已游玩的数据进行深入分析。它的目标是从众多游戏中筛选出最适合…

糖果传递问题(超详细的数论公式推导+贪心结论+均分问题)

糖果传递问题 文章目录 糖果传递问题问题描述问题分析【公式推导过程】代码 问题描述 有 n 个小朋友坐成一圈&#xff0c;每人有 a[i] 个糖果。 每人只能给左右两人传递糖果。 每人每次传递一个糖果代价为 1。 求使所有人获得均等糖果的最小代价。 输入格式 第一行输入一个正…

【2】贪心算法-综述

前言 从前&#xff0c;有一个很穷的人救了一条蛇的命&#xff0c;蛇为了报答他的救命之 恩&#xff0c;于是就让这个人提出要求&#xff0c;满足他的愿望。这个人一开始只要求简 单的衣食&#xff0c;蛇都满足了他的愿望&#xff0c;后来慢慢地贪欲升起&#xff0c;要求做官&am…

基于SSM的出租车管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

智荟康午休课桌椅成为第十届中国慈善展览会公益亮点产品

第十届中国慈善展览会&#xff08;以下简称“慈展会”&#xff09;于9月15日至17日在深圳会展中心隆重举办&#xff0c;此次展会为期3天&#xff0c;主要围绕“共建现代化慈善&#xff0c;聚力高质量发展”的主题&#xff0c;重点聚焦聚力民生福祉&#xff0c;将打造“一展多元…