运算符重载之自定义类型的流提取插入

目录

istream输入流

流提取操作符 >>

ostream输出流 

流插入运算符 <<

总结

如何实现对自定义类型的输入和输出?

输出为例:

流插入运算符 << 重载

自定义类中定义

分析

类外定义

解放方案1

解决方案2

优化->令其支持连续的流插入

流提取自定义类型

 总结


在我们刚开始学c++时,cin 提取和 cout 插入 ,可以直接识别类型,这个规则是需要我们记住的,方便我们的输入和输出。

那么他们是怎么实现的呢?为何可以直接识别类型呢?

在这里给大家推荐非常好用的网站,有什么c++上的问题,都可以在上面查找

cplusplus.com - C++资源网络

实际上cin 和 cout 相当于由 istream 和 ostream 创建的对象。

istream输入流

可以说istream相当于库中已经定义好的一个类,而 cin 是跟据输入流创建好的对象:

输入流对象可以读取和解释字符序列中的输入,提供了特定成员来执行这些输入操作

有了可以读取并解释输入,如何执行输入?

相当于现在有想要输入的值,cin 可以识别这个值,并将其提取到相应的类型变量中。

怎么样将 cin 和变量相联系起来:

这个桥梁就是流提取操作符。

流提取操作符 >>

>> 在我们以前的印象中是右移运算符,但在这里却摇身一变为 流提取操作符。这是为什么?

这里就是用到了运算符重载,令它可以进行如上操作。

但是我们发现它不需要进行数据格式控制,可以自动识别类型

没有c语言那么繁琐:整形--%d,字符--%c ……

原因是:运算符重载+函数重载

ostream输出流 

相应的,ostream也是库中定义好的一个类,cout 为其创建的对象:

输出流对象可以写入字符序列并表示其他类型的数据。提供了特定成员来执行这些输出操作

意思就是,将已有的内置类型数据插入到对象 cout中, cout 识别后输出到显示屏上。

与输入流相对应,变量和 cout 间的桥梁是 流插入运算符 <<

流插入运算符 <<

<< 原本应该是左移运算符,因此 << 也是被重载了

使用它也不需要进行数据格式的控制,因此不止被重载一次:

总结

cin 和 cout 是用输入流和输出流创建好的对象

cin 和 流提取运算符 >> 一起使用

cout 和 流插入运算符 << 一起使用

输入输出不用进行数据格式的控制的原因是:

对应输入流输出流中的成员函数已经对操作符进行了运算符重载+函数重载,因此可以实现对内置类型的自动识别

如何实现对自定义类型的输入和输出?

上篇《日期类的实现》中:日期类的实现_i跑跑的博客-CSDN博客

 我们对运算符重载有了很深的印象及基本的运用。那么当我们定义并创建好一个对象后,能否对此对象直接进行输入或着输出?

输出为例:

因此,我们应该现在类中定义属于我们自定义类型 日期类的 流插入运算符。

流插入运算符 << 重载

自定义类中定义

我们首先要明确,函数的参数是两个 ,一个是参数的类型是输出流,另一个参数是要输出的对象,由上面的对比可以得出。

而在类中定义的话,有一个隐含的 this 指针,指向的就是要输出的对象,因此我们要传的参数只有一个:输出流对象

分析

形参的顺序不对!! 那么使用的两个对象的使用位置也不一样,交换使用位置即可:

首先我们得知道:内置类型输出时, 流插入运算符是定义在输出流中的

而在自定义类型中,成员函数(operator<<)不在cout对象中,而在自定义类型中

因此我们只要解决重载函数中,第一个形参是输出流类型即可。类中定义的函数默认第一个形参是this指针,不可更改,那么我们就需要运算符重载定义在类外即可

类外定义

解放方案1

在类中添加获取数据成员的函数:

 

解决方案2

设置友元函数

友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。

优化->令其支持连续的流插入

通过开头我们看到的库中的流提取插入的运算符重载,我们不难发现他们有一个返回值,返回值的类型是输入流或者输出流,这是支持连续插入或连续输出的原因

cout<<d4 后输出 d4 ,返回 cout

cout<<d5 后输出d5,返回cout,变为cout;

不会产生任何影响:

 这样自定义类型的流插入就完成了同理,也可以写出自定义类型流提取的运算符重载:


流提取自定义类型

 总结

对自定义类型进行流提取和流插入操作符的重在时,要与内置类型用法相同:

在类外定义

函数传参第一个参数应为输入流或输出流类型

第二个参数为自定义的类型

返回为输入流和输出流,可支持连续提取和插入

  • 32
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 25
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今年依旧去年春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值