输入输出(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++的输入输出运算符
目录 一、输入运算符>> 二、输出运算符<< 三、 输入与输出运算符的重载 (一)必须重载为类的友元函数 (二)返回类型应是对象的引用 一、输入运算符>> 输人运算符“>>”也称为流提取运算符,是一个二目…...

[图解]产品经理创新模式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 把我们要做的系统放进去,改进它 4 00:00:13,470 --> 00:00:15,260 怎么改进?…...
npm 上传包
将自己做好的包做好后上传 1. 切换镜像(只能通过官网代理来上传) npm config set registry https://registry.npmjs.org/ 2. 添加用户(等价登录) 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基本完成质控;本次版本推进到1.7,1.7集菜单权限、登录、打印导出客户端、初始化、质控、Linux客户端、仪器连接和监控体系各种功能大全,上十年写系统用到的都全了。 这次直接挑战检验最难…...
Python错误集锦:xlwt写入表格时提示exception-unexpected-data-type-class-bytes
原文链接:http://www.juzicode.com/python-error-exception-unexpected-data-type-class-bytes 错误提示: #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面试题(八)
上一篇地址:赶紧收藏!2024 年最常见 20道 Redis面试题(七)-CSDN博客 十五、一个Redis实例最多能存放多少的keys? Redis实例能存放的键(keys)的数量主要受限于以下几个因素: 物理内…...
Flowable第一次启动MYSQL8.0版本(踩坑)
flowable工作流项目第一次启动报错表不存在,是因为连接mysql数据库的时候没有设置&nullCatalogMeansCurrenttrue,mysql5.0以上该配置默认为flase,即不操作本数据库。因此需要修改为true。datasource:url: jdbc:mysql://127.0.0.1:3306/fl…...

Java基础的语法---StringBuilder
StringBuilder 构造方法 StringBuilder():创建一个空的StringBuilder实例。 StringBuilder(String str):创建一个StringBuilder实例,并将其初始化为指定的字符串内容。 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接口体系 之前写过一篇博客,Tomcat的Servlet-GenericServlet-HttpServlet体系的具体结构,以及Servlet的生命周期 Servlet讲解 想要模仿tomcat获取动态资源,就需要我们自己仿写一个Servlet接口体系 主要包括:…...
软件测试面试题(四)
一:测试评估的目标? 量化测试进程 生成缺陷和测试覆盖率的总结报告 测试评估的问题 没有把测试覆盖率作为报告测试进程的根据,使得不知测试是否结束; 没有做测试缺陷评估,缺陷评估是量度软件可行性的重要指标&…...
infoq学习笔记-云原生网关当道,三大主流厂商如何“竞 技”?
注基础组件的质量,这些基础组件是用户看不到的。这些组件包括代码质量、自动化的CI/CD、端对端测试、混沌测试等。在APISIX中,我们内置了大 量的测试案例代码,包括单元测试、E2E测试、混沌测试,以及一些基准测试等,从而…...

Python中别再用 ‘+‘ 拼接字符串了!
大家好,在 Python 编程中,我们常常需要对字符串进行拼接。你可能会自然地想到用 操作符将字符串连接起来,毕竟这看起来简单明了。 在 Python 中,字符串是不可变的数据类型,这意味着一旦字符串被创建,它就…...
前端上传heic图片转jpe格式并展示
各大浏览器对 HEIC 格式图片的支持情况,包括上传和显示的支持度 浏览器版本HEIC 上传HEIC 显示Chrome版本 85 及以上支持不支持Firefox所有版本支持不支持Safari版本 11 及以上支持支持Edge版本 18 及以上支持不支持Opera所有版本支持不支持IE不支持不支持不支持 …...

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

指纹识别概念解析
目录 1. 指纹是物证之首 1.1 起源于中国 1.2 发展于欧洲 1.3 流行于全世界 2. 指纹图像 3. 指纹特征 4. 指纹注册 5. 指纹验证 6. 指纹辨识 1. 指纹是物证之首 指纹识别技术起源于中国、发展于欧洲、流行于全世界。自20世纪以来,指纹在侦破刑事案件、解决诉…...
图像处理神经网络数据预处理步骤的详细解释和分析
1. 尺寸调整(Resizing) 目的:神经网络通常需要固定尺寸的输入图像。通过统一图像尺寸,可以确保输入的一致性,使得网络能够正常处理。 方法:将所有输入图像调整为特定的尺寸(例如224x224像素&a…...

音视频开发4-补充 FFmpeg 开发环境搭建 -- 在windows 上重新build ffmpeg
本节的目的是在windows 上 编译 ffmpeg 源码,这样做的目的是:在工作中可以根据工作的实际内容裁剪 ffmpeg,或者改动 ffmpeg 的源码。 第一步 :下载, 安装,配置 ,运行 msys64 下载 下载地址&…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...