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

目录

istream输入流

流提取操作符 >>

ostream输出流 

流插入运算符 <<

总结

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

输出为例:

流插入运算符 << 重载

自定义类中定义

分析

类外定义

解放方案1

解决方案2

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

流提取自定义类型

 总结


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

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

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

cplusplus.com - C++资源网络

运算符重载之自定义类型的流提取插入_第1张图片

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

istream输入流

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

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

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

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

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

运算符重载之自定义类型的流提取插入_第2张图片

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

流提取操作符 >>

运算符重载之自定义类型的流提取插入_第3张图片

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

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

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

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

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

运算符重载之自定义类型的流提取插入_第4张图片

ostream输出流 

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

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

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

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

流插入运算符 <<

运算符重载之自定义类型的流提取插入_第5张图片

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

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

运算符重载之自定义类型的流提取插入_第6张图片

总结

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

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

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

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

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

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

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

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

输出为例:

运算符重载之自定义类型的流提取插入_第7张图片

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

流插入运算符 << 重载

自定义类中定义

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

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

运算符重载之自定义类型的流提取插入_第8张图片

运算符重载之自定义类型的流提取插入_第9张图片

分析

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

运算符重载之自定义类型的流提取插入_第10张图片

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

运算符重载之自定义类型的流提取插入_第11张图片

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

运算符重载之自定义类型的流提取插入_第12张图片

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

类外定义

运算符重载之自定义类型的流提取插入_第13张图片

解放方案1

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

运算符重载之自定义类型的流提取插入_第14张图片 

解决方案2

设置友元函数

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

运算符重载之自定义类型的流提取插入_第15张图片

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

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

运算符重载之自定义类型的流提取插入_第16张图片

运算符重载之自定义类型的流提取插入_第17张图片

cout<

cout<

不会产生任何影响:

运算符重载之自定义类型的流提取插入_第18张图片

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


流提取自定义类型

运算符重载之自定义类型的流提取插入_第19张图片

 总结

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

在类外定义

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

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

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

你可能感兴趣的:(C++笔记,c++,开发语言)