输入输出(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 下载 下载地址&…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
