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

输入输出(4)——C++的输入输出运算符

目录

一、输入运算符>>

二、输出运算符<<

三、 输入与输出运算符的重载

(一)必须重载为类的友元函数

(二)返回类型应是对象的引用


一、输入运算符>>

输人运算符“>>”也称为流提取运算符,是一个二目运算符,

两个操作数

左操作数是istream类的一个对象

右操作数既可以是一个预定义的变量,也可以是重载了该运算府的类对象。

因此,输人运算符不仅能够识别预定义类型的变量,如果某个类中重载了这个运算符,它也能识别这个类的对象。

在使用输入运算符时需要注意以下几点。

(1)在默认情况下,运算符“>>”跳过空白符,然后读取与输入变量类型相对应的值此,给一组变量输人值时可以用空格或换行符把输入的数值间隔开。

(2)当输入字符串时,运算符“>>”会跳过空白符,因此读取的字符串中不要有空格否则认为是结束

(3)不同类型的变量一起输入时,系统除了检查是否有空白符外,还完成输入数据与变量类型的匹配

如:
int n;
float x;
cin>>n>>x;

如果输人:33.33  22.22

则得到的结果为n=33.  x=0.33.

(4)输入运算符采用左结合方式,可以将多个输人操作组合到一个语句中。

二、输出运算符<<

输出运算符“<<”也称为流插人运算符,是一个二目运算符

两个操作数

左操作数是ostream类的一个对象

右操作数既可以是一个预定义的变量,也可以是重载了该运算符的类对象。

因此,输出运算符不仅能够识别预定义类型的变量,如果某个类中重载了该运算符.它也能识别这个类的对象。
在使用输出运算符时需要注意以下几点。

(1)输出运算符也采用左结合方式,可以将多个输出操作组合到一个语句中。如,

int n=1;
double m=1.1;
cout<<n<< ","<<m<<endl;

输出结果就是:
1,1.1

(2)使用输出运算符时,不同类型的数据也可以组合在一条语句中,编译程序会根据在“<<”右边的变量或常量的类型,决定调用重载该运算符的哪个重载函数,

三、 输入与输出运算符的重载

用户可以通过对输人运算符“>>”和输出运算符“<<”进行重载来支持新的数据类型的输入输出。

如果想用它们输出和输人用户自己定义的类型的数据,就必须对它们进行重载。实际上,运算符“<<”和“>>”已经被重载过很多次了。最初,“<<”和“>>”运算符是(和C++的位运算符。ostream类对“<<”运算符进行了重载,将其转换为一个输出工具cout是ostream类的一个对象,它是智能的,能够识别所有的C++基本类型。这是因为对于每种类型,ostream类声明中都包含了相应的重载函数“operator<<”的定义。因此要使cout能够识别用户自定义类的对象,就要在用户自定义类中对“<<”运算符进行重载,让用户自定义类知道如何使用cout。

在重载时要注意下面两点。

(一)必须重载为类的友元函数


要对“<<”和“>>”运算符进行重载,必须重载为类的友元函数
为什么一定要重载为类的友元函数呢?

定义了一个Point类,假设t是Point的一个对象,为显示Point的值,使用下面的语句:
cout<<t;
这个语句中,使用了两个对象,其中第一个是ostream类的对象(cout)

如果使用一个Point 成员函数来重载“<<”运算符,Point对象(this指针)将是第一个操作数,这就意味着必须这样使用“<<”运算符:
t<<cout;
这样会令人迷惑。但通过使用友元函数,可以像下面这样重载运算符

void operator<<(ostream &out,Point &t){ cout<<"("<<t .x<<","<<t ,y<<")"<<endl; }


这样可以使用下面的语句:
cout<<t;

注意:新的“operator<<”定义使用 ostream 类引用 out 作为它的第一个参数。

通常情况下,out 引用 cout 对象,如表达式“cout<<t”所示。但也可以将这个运算符用于其他ostream对象,如cerr,在这种情况下,out将引用相应的对象。

调用“cout<<t”应使用cout对象本身,而不是它的副本,因此该函数按引用(而不是按值)来传递该对象。这样,表达式“cout<<t”将导致out成为cout的一个别名。Point对象可以按值或按引用来传递,因为这两种形式都使函数能够使用对象的值。按引用传递使用的内存和时间都比按值传递少

(二)返回类型应是对象的引用

重载的友元函数的返回类型应是ostream对象或istream对象的引用,即osream&或 istream &

经过声明和定义上面的重载函数,如下面这样的语句:

cout<<t;

可以正常工作,但下面的语句:
cout<< "t= "<<t ;

不能正常的输出。要理解这样做不可行的原因以及必须如何才能使其正常输出,首先看下面的语句:

int x=5,y=6;
cout<< x<< y;
C++从左到右读取输出语句,这意味着它等同于:
(cout<<x)<< y;

正如iostream中定义的那样,“<<”运算符要求左边是一个ostream类的对象。显然,因为cout是ostream对象,所以表达式“cout<<x”满足这种要求。但是,因为表达式“cout<<x”位于“<<y”的左侧,所以输出语句也要求该表达式是一个ostream 类型的对象。因此,ostream 类将“operator<<”函数实现为返回一个ostream对象。具体地说,在这个例子中,它返回调用对象cout。因此,表达式“cout<<x”本身也是一个ostream对象,从而可以位于“<<”运算符的左侧。

可以对上面的“operator<<”友元函数采用相同的方法。只要修改“operator<<”函数,让它返回ostream 对象的引用即可。

ostream& operator<<(ostream &out, Point &t)
{out<<"("<<t .x<< ","<<t・y<<")"<<endl;return out;
}

注意,返回类型是ostream&。这意味着该函数返回ostream对象的引用。因为函数开始执行时,程序传递一个对象给它,这样做的最终结果是,函数的返回值就是传递给它的对象。也就是说,下面的语句:
cout<<t;
各被转换为下面的调用:
operator<<(cout,t);
而调用返回 cout对象。因此,下面的语句可以正常工作:
cout<<"t= "<<t;

将这条语句分成多步,来看看它是如何工作的。
首先,“cou<<"t="”调用 ostream 类中的"operator<<"定义,它显示字符电并近cout对象。因此表达式“cout<<"="”将显示字符串,然后被它的返回值cout所原来的语句被简化为下面的形式:
cout<<t;

#include<iostream>
using namespace std;
class Date
{
public:Date(int x, int y, int z);friend ostream& operator<<(ostream& out, Date& date);
private:int year;int month;int day;
};
Date::Date(int x,int y,int z):year(x),month(y),day(z){}
ostream& operator << (ostream & out, Date & date)
{out << date.year << '/' << date.month << '/' << date.day << endl;return out;
}
int main()
{Date d1(1, 1, 1);Date D2(1, 2, 3);cout << d1 << D2;return 0;
}

程序运行结果如下:

1/1/1
1/2/3

相关文章:

输入输出(4)——C++的输入输出运算符

目录 一、输入运算符>> 二、输出运算符<< 三、 输入与输出运算符的重载 &#xff08;一&#xff09;必须重载为类的友元函数 &#xff08;二&#xff09;返回类型应是对象的引用 一、输入运算符>> 输人运算符“>>”也称为流提取运算符,是一个二目…...

[图解]产品经理创新模式01物流变成信息流

1 00:00:01,570 --> 00:00:04,120 有了现状的业务序列图 2 00:00:04,960 --> 00:00:08,490 我们就来改进我们的业务序列图了 3 00:00:08,580 --> 00:00:11,010 把我们要做的系统放进去&#xff0c;改进它 4 00:00:13,470 --> 00:00:15,260 怎么改进&#xff1f;…...

npm 上传包

将自己做好的包做好后上传 1. 切换镜像&#xff08;只能通过官网代理来上传&#xff09; npm config set registry https://registry.npmjs.org/ 2. 添加用户&#xff08;等价登录&#xff09; npm addUser 3. 提交 npm publish 4. 删除 npm unpublish [<pkg>][&…...

Python 小游戏——贪吃蛇

Python 小游戏——贪吃蛇 文章目录 Python 小游戏——贪吃蛇项目介绍环境配置代码设计思路1. 初始化和变量定义2. 创建游戏窗口和FPS控制器3. 初始化贪吃蛇和食物的位置4. 控制贪吃蛇的方向和分数5. 主游戏循环 难点分析源代码呈现代码结果 项目介绍 贪吃蛇游戏是一款通过上下…...

人工智能方面顶会

人工智能 AAAI the National Conference on Artificial Intelligence 美国人工智能协会主办 IJCAJ the International Joint Conference on Artificial Intelligence每年举办 计算机视觉 CVPR IEEE Conference on Computer Vision and Pattern Recognition ECCV European Co…...

JRT1.7发布

JRT1.7连仪器在线演示视频 JRT1.5实现质控主体、1.6基本完成质控&#xff1b;本次版本推进到1.7&#xff0c;1.7集菜单权限、登录、打印导出客户端、初始化、质控、Linux客户端、仪器连接和监控体系各种功能大全&#xff0c;上十年写系统用到的都全了。 这次直接挑战检验最难…...

Python错误集锦:xlwt写入表格时提示exception-unexpected-data-type-class-bytes

原文链接&#xff1a;http://www.juzicode.com/python-error-exception-unexpected-data-type-class-bytes 错误提示&#xff1a; #juzicode.com/VX公众号:juzicode import xlwt wb xlwt.Workbook() ws wb.add_sheet(juzicode) a bjuzicode ws.write(3, 0, 桔子code) ws.wri…...

赶紧收藏!2024 年最常见 20道 Redis面试题(八)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道 Redis面试题&#xff08;七&#xff09;-CSDN博客 十五、一个Redis实例最多能存放多少的keys&#xff1f; Redis实例能存放的键&#xff08;keys&#xff09;的数量主要受限于以下几个因素&#xff1a; 物理内…...

Flowable第一次启动MYSQL8.0版本(踩坑)

flowable工作流项目第一次启动报错表不存在&#xff0c;是因为连接mysql数据库的时候没有设置&nullCatalogMeansCurrenttrue&#xff0c;mysql5.0以上该配置默认为flase&#xff0c;即不操作本数据库。因此需要修改为true。datasource:url: jdbc:mysql://127.0.0.1:3306/fl…...

Java基础的语法---StringBuilder

StringBuilder 构造方法 StringBuilder()&#xff1a;创建一个空的StringBuilder实例。 StringBuilder(String str)&#xff1a;创建一个StringBuilder实例&#xff0c;并将其初始化为指定的字符串内容。 StringBuilder(int a): 创建一个StringBuilder实例…...

【微服务】springboot 构建镜像多种模式使用详解

目录 一、前言 二、微服务常用的镜像构建方案 3.1 使用Dockerfile 3.2 使用docker plugin插件 3.3 使用docker compose 编排文件 三、环境准备 3.1 服务器 3.2 安装JDK环境 3.2.1 创建目录 3.2.2 下载安装包 3.2.3 配置环境变量 2.2.4 查看java版本 3.3 安装maven …...

手写tomcat(Ⅲ)——tomcat动态资源的获取

仿写tomcat的Servlet接口体系 之前写过一篇博客&#xff0c;Tomcat的Servlet-GenericServlet-HttpServlet体系的具体结构&#xff0c;以及Servlet的生命周期 Servlet讲解 想要模仿tomcat获取动态资源&#xff0c;就需要我们自己仿写一个Servlet接口体系 主要包括&#xff1a…...

软件测试面试题(四)

一&#xff1a;测试评估的目标&#xff1f; 量化测试进程 生成缺陷和测试覆盖率的总结报告 测试评估的问题 没有把测试覆盖率作为报告测试进程的根据&#xff0c;使得不知测试是否结束&#xff1b; 没有做测试缺陷评估&#xff0c;缺陷评估是量度软件可行性的重要指标&…...

infoq学习笔记-云原生网关当道,三大主流厂商如何“竞 技”?

注基础组件的质量&#xff0c;这些基础组件是用户看不到的。这些组件包括代码质量、自动化的CI/CD、端对端测试、混沌测试等。在APISIX中&#xff0c;我们内置了大 量的测试案例代码&#xff0c;包括单元测试、E2E测试、混沌测试&#xff0c;以及一些基准测试等&#xff0c;从而…...

Python中别再用 ‘+‘ 拼接字符串了!

大家好&#xff0c;在 Python 编程中&#xff0c;我们常常需要对字符串进行拼接。你可能会自然地想到用 操作符将字符串连接起来&#xff0c;毕竟这看起来简单明了。 在 Python 中&#xff0c;字符串是不可变的数据类型&#xff0c;这意味着一旦字符串被创建&#xff0c;它就…...

前端上传heic图片转jpe格式并展示

各大浏览器对 HEIC 格式图片的支持情况&#xff0c;包括上传和显示的支持度 浏览器版本HEIC 上传HEIC 显示Chrome版本 85 及以上支持不支持Firefox所有版本支持不支持Safari版本 11 及以上支持支持Edge版本 18 及以上支持不支持Opera所有版本支持不支持IE不支持不支持不支持 …...

VMware虚拟机-设置系统网络IP、快照、克隆

1.设置网络IP 1.点击右上角开关按钮-》有线 已连接-》有线设置 2.手动修改ip 3.重启或者把开关重新关闭开启 2.快照设置 快照介绍&#xff1a; 通过快照可快速保存虚拟机当前的状态&#xff0c;后续可以使用虚拟机还原到某个快照的状态。 1.添加快照(需要先关闭虚拟机) 2.在…...

指纹识别概念解析

目录 1. 指纹是物证之首 1.1 起源于中国 1.2 发展于欧洲 1.3 流行于全世界 2. 指纹图像 3. 指纹特征 4. 指纹注册 5. 指纹验证 6. 指纹辨识 1. 指纹是物证之首 指纹识别技术起源于中国、发展于欧洲、流行于全世界。自20世纪以来&#xff0c;指纹在侦破刑事案件、解决诉…...

图像处理神经网络数据预处理步骤的详细解释和分析

1. 尺寸调整&#xff08;Resizing&#xff09; 目的&#xff1a;神经网络通常需要固定尺寸的输入图像。通过统一图像尺寸&#xff0c;可以确保输入的一致性&#xff0c;使得网络能够正常处理。 方法&#xff1a;将所有输入图像调整为特定的尺寸&#xff08;例如224x224像素&a…...

音视频开发4-补充 FFmpeg 开发环境搭建 -- 在windows 上重新build ffmpeg

本节的目的是在windows 上 编译 ffmpeg 源码&#xff0c;这样做的目的是&#xff1a;在工作中可以根据工作的实际内容裁剪 ffmpeg&#xff0c;或者改动 ffmpeg 的源码。 第一步 &#xff1a;下载&#xff0c; 安装&#xff0c;配置 &#xff0c;运行 msys64 下载 下载地址&…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...