c++重载输出流(<<)和输入流(>>)

一.重载输出流

在C++中,可以重载输出流运算符(<<)来自定义对象的输出方式。重载输出流运算符允许我们以自定义的方式将对象输出到标准输出流或其他输出流中。

以下是关于重载输出流运算符(<<)的几个知识点以及相应的示例:

  1. 重载输出流运算符的语法:
    重载输出流运算符必须作为一个普通的全局函数或者类的成员函数来实现。其语法如下:
std::ostream& operator<<(std::ostream& os, const MyClass& obj) {// 输出obj到os流中return os;
}
  1. 返回类型:
    重载输出流运算符通常返回一个 std::ostream 的引用,以便支持连续输出。

  2. 参数类型:
    通常情况下,第一个参数是一个 std::ostream 的引用,用于指定输出流;第二个参数是要输出的对象的引用或常量引用。

  3. 示例:
    下面是一个简单的示例,演示了如何重载输出流运算符来输出自定义的对象:

#include <iostream>class Point {
private:int x, y;
public:Point(int x, int y) : x(x), y(y) {}friend std::ostream& operator<<(std::ostream& os, const Point& point);
};std::ostream& operator<<(std::ostream& os, const Point& point) {os << "(" << point.x << ", " << point.y << ")";return os;
}int main() {Point p(3, 4);std::cout << "Point p: " << p << std::endl;return 0;
}

在上面的示例中,我们定义了一个 Point 类,并重载了输出流运算符来输出 Point 对象的坐标。

  1. 可以重载多个输出流运算符:
    类型可以重载多个输出流运算符,以支持不同的输出格式或不同的输出流类型。

重载输出流运算符是 C++ 中常见的技术之一,能够让我们以自定义的方式输出对象,提高代码的可读性和灵活性。

二.重载输入流

在C++中,重载输入流运算符>>是一种常见的技术,用于自定义数据类型与输入流的交互。通过重载输入流运算符,可以让自定义类对象能够像基本数据类型一样从输入流中读取数据。下面我们将详细介绍如何重载输入流运算符,并举例说明其用法

  1. 重载函数原型:
istream& operator>>(istream& in, YourClass& obj);
  1. 返回类型:重载的输入流运算符函数应该返回输入流对象的引用(istream&),以支持链式输入操作。

  2. 参数:通常情况下,第一个参数是输入流对象的引用,表示要从哪个输入流中读取数据;第二个参数是自定义类对象的引用,表示要将读取的数据存入哪个对象中。

  3. 实现:在重载函数中,可以使用输入流对象的各种方法(如getline、>>等)来从输入流中读取数据,并将其存入自定义类对象中。

  4. 举例分析:

假设我们有一个自定义的日期类Date,包含年、月、日三个成员变量,我们希望能够通过重载输入流运算符>>从输入流中读取日期数据并存入Date对象中。

#include <iostream>
#include <string>class Date {
private:int year;int month;int day;public:// 重载输入流运算符friend istream& operator>>(istream& in, Date& d) {char c;in >> d.year >> c >> d.month >> c >> d.day; // 从输入流中读取年、月、日,中间用字符'/'分隔return in;}// 输出日期信息void printDate() {cout << year << "/" << month << "/" << day << endl;}
};int main() {Date date;cout << "请输入日期(格式:年/月/日):" << endl;cin >> date; // 通过重载的输入流运算符从输入流中读取日期数据cout << "输入的日期是:";date.printDate(); // 输出读取的日期信息return 0;
}

在上面的示例中,我们定义了Date类并重载了输入流运算符>>。在主函数中,我们创建了一个Date对象date,并通过cin >> date从标准输入流中读取日期数据。最后调用printDate函数输出读取的日期信息。

通过重载输入流运算符,我们实现了自定义类对象与输入流的无缝交互,使得我们可以方便地从输入流中读取数据并存入自定义对象中

三.ostream介绍

在C++中,std::ostream 是一个用于输出数据的基本类,它是标准库中的输出流类之一。std::ostream 类定义了一系列成员函数,可以用来向其绑定的输出设备(如标准输出流、文件等)进行数据输出操作。

下面是关于 std::ostream 类的一些重要知识点:

  1. std::ostream 类是由 头文件定义的,它是一个抽象基类,不能直接使用,通常需要结合其派生类 std::ofstream 或 std::cout 使用。

  2. 作为抽象基类,std::ostream 提供了一系列虚拟函数供其派生类实现,例如 put(),write(),flush() 等。

  3. std::ostream 类的常用成员函数包括:

  • operator<< 重载运算符,用于输出各种类型的数据到输出流中。
  • put() 将一个字符写入输出流。
  • write() 将指定长度的字符序列写入输出流。
  • flush() 刷新输出流,将缓冲区中的数据写入输出设备。
  • tellp() 返回当前位置指针在输出流中的位置。
  1. std::ostream 类是一个抽象类,不能直接实例化,通常需要通过其派生类 std::ofstream(用于文件输出)或 std::cout(标准输出流)来实现具体的输出操作。

  2. 示例:
    下面是一个简单的示例,演示了如何使用 std::ostream 类的派生类 std::cout 输出数据到标准输出流:

#include <iostream>int main() {int num = 42;double pi = 3.14159;std::cout << "The number is: " << num << std::endl;std::cout << "The value of pi is: " << pi << std::endl;return 0;
}

在上面的示例中,我们使用 std::cout 对象(派生自 std::ostream 类)输出整数和浮点数到标准输出流。

总之,std::ostream 类是 C++ 标准库中用于输出数据的基本类,通过其派生类可以实现向不同输出设备进行数据输出操作,是 C++ 中输出操作的基础类之一。

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

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

相关文章

RNN/LSTM/GRU/TRANFORMER/编码器解码器理解

编码器和解码器是一种框架,lstm和gru都是这个框架中对这一框架的不同实现 编码器与解码器是一种架构,一种思想,注意力也是一种思想,相互独立,只是二者可以结合以用来训练模型可以提升模型能力 rnn gru lstm是三种不同的模型 里面并没有注意力机制这回事 RNN中有编码器和解码器实…

时间安排 |规划

计算机网络&#xff08;记得完成作业本上的习题&#xff09; 先看王道知识点讲解 然后不懂得看 计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;_哔哩哔哩_bilibili 最后做本章习题 【乱讲的】《计算机网络》&#xff08;第8版&#xff09;课后习题讲解_哔哩…

杀疯了!PerfXCloud-AI大模型夏日狂欢来袭,向基石用户赠送 ∞ 亿Token!

【澎峰科技重磅消息】 在全球范围内大模型正逐渐成为强大的创新驱动力。在这个充满激情的夏日&#xff0c;PerfXCloud为开发者和企业带来了前所未有的福利&#xff1a; 1. 零成本亲密、深度体验大模型&#xff0c;提供大量示范案例。 2. 向基石用户赠送∞亿Token的激励计划。…

预期和视角之外是什么?

记得“大时代”里讲过这么一句话,你要在你的世界里打败敌人。这句话,证明了人是活在心境里,小时候看到的葫芦娃也是这个道理,你去找蛇精去人家地盘上,容易中计,葫芦娃救爷爷一个个送,你要不中计就要逃出她的心境。在股票市场,养家心法是什么?它是心境,92科比说过要么…

HTML静态网页成品作业(HTML+CSS+JS)——家乡莆田介绍网页(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片轮播&#xff0c;共有5个页面。 二、作品…

qt 简单实验 json格式的文件写入配置文件

1.概要 2.代码 //#include "mainwindow.h"#include <QApplication> #include <QFile> #include <QJsonDocument> #include <QJsonObject> //读取json数据的配置文件int main(int argc, char *argv[]) {QApplication a(argc, argv);QString…

学懂C#编程:常用高级技术——委托(Delegate)应用场景——委托与Lambda表达式的结合使用详解

在C#中&#xff0c;委托与Lambda表达式的结合使用是现代编程实践中的一个重要且强大的特性&#xff0c;它极大地提高了代码的简洁性和可读性。下面将详细讲解这两个概念如何协同工作&#xff0c;以及如何在实际编程中有效利用它们。 委托基础 委托是C#中的一种引用类型&#x…

基于SpringBoot+协同过滤算法的家政服务平台设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

问题解答:如何每隔2分钟弹出一次弹出框

事情是这样的&#xff0c;昨天有个粉丝问我&#xff1a;如何每隔2分钟弹出一次弹出框。 我说 那不就是setInterval嘛&#xff0c;然后设定2分钟执行一次。 他说 不是的&#xff0c;这个2分钟只是我说的一个时间&#xff0c;不是常量&#xff0c;是服务端下发的。 我说 那就获取…

matlab入门基础笔记

1、绘制简单三角函数&#xff1a; 绘制正弦曲线和余弦曲线。x[0:0.5:360]*pi/180; plot(x,sin(x),x,cos(x)); &#xff08;1&#xff09;明确x轴与y轴变量&#xff1a; 要求为绘制三角函数&#xff1a; X轴&#xff1a;角度对应的弧度数组 Y轴&#xff1a;对应sin(x)的值 求…

电商平台生活用品销售数据分析与应用

摘 要 在当前互联网飞速发展的时代&#xff0c;计算机应用给我们的工作生活带来了极大的便利。如今我们的生活离不开电商平台&#xff0c;其随之而来的是各种各样的销售数据与消费者信息&#xff0c;这些数据和信息的分析应用成为了当前互联网领域研究的重要部分。 本论文以基…

python自动化办公工具:自动批量生成奖状的工具(可视化)

&#x1f446;点击关注 获取更多编程干货&#x1f446; 不知道大家有没有注意到一种趋势&#xff0c;现在即便是那些非程序员&#xff0c;甚至对计算机一窍不通的人&#xff0c;也开始学习Python了&#xff0c;其“普及程度”实在让人感到有些惊讶。 那么&#xff0c;对于那些…

如何通过防泄密U盘,实现数据传输的安全性及可控性?

随着信息技术的发展&#xff0c;U盘作为重要的数据存储和传输工具&#xff0c;其安全性越来越受到关注。在日常办公中&#xff0c;经常会遇到这类情况&#xff1a;员工为了方便&#xff0c;随意使用U盘拷贝公司的机密资料。一旦U盘丢失或者被窃取&#xff0c;公司的机密资料就有…

警惕!最新17本期刊(含2本Top)被“镇压”,无影响因子无分区,这是被踢了吗?

本周投稿推荐 SSCI • 中科院2区&#xff0c;6.0-7.0&#xff08;录用友好&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; CNKI • 7天录用-检索&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#xff0c;0.5-1.0&#xff08;录用…

【金】02Y90-60 大数据-HivetoMysQL

1、安装 Java 程序&#xff08;jdk&#xff09; 2、添加以下JAR包 3、确认配置成自己的数据库 ....

【数据结构与算法】线索二叉树 详解

为什么可在不增加指针域的情况下&#xff0c;对二叉树进行线索化&#xff1f; 不增加指针域&#xff1a;因为可以利用n1个空链域。 在线索二叉树中&#xff0c;为每个节点添加两个标志位&#xff0c;分别表示左指针和右指针是普通的孩子指针还是线索&#xff08;前驱或后继&a…

禅道身份认证绕过漏洞(QVD-2024-15263)复现

禅道项目管理系统在开源版、企业版、旗舰版的部分版本中都存在此安全漏洞。攻击者可利用该漏洞创建任意账号实现未授权登录。 1.漏洞级别 高危 2.漏洞搜索 fofa: title"禅道"3.影响范围 v16.x < 禅道 < v18.12 &#xff08;开源版&#xff09; v6.x <…

解决云原神在Linux浏览器鼠标无法旋转视角问题

【20230917】手动修复米哈游云游戏在Linux平台无法锁定鼠标问题 - 哔哩哔哩 // UserScript // name Genshin Cloud Mouse Fix // namespace https://www.bilibili.com/read/cv26576757/ // version 0.1 // description Fix a Genshin cloud game mouse move …

《STM32 HAL库》CAN通信系列函数详尽解析——HAL_CAN_Init()

食用指南&#xff1a;本文主要内容为梳理CAN初始化函数主要运行逻辑及重点功能实现代码的详尽解析。函数源码在文末&#xff0c;建议在阅读源码之后观看。 CAN相关寄存器图&#xff1a; 主要逻辑分析&#xff1a; 下面分点梳理函数的主要逻辑&#xff08;注意逻辑序号&#xf…

function包装器和bind包装器

function包装器和bind包装器 包装器function包装器为什么需要functionfunction包装器function包装器的应用场景逆波兰表达式求值 bind包装器bind包装器的应用场景 包装器 包装器是用于给其他编程接口提供更一致或更合适的接口 由于函数调用可以使用函数名、函数指针、函数对象…