目录
istream输入流
流提取操作符 >>
ostream输出流
流插入运算符 <<
总结
如何实现对自定义类型的输入和输出?
输出为例:
流插入运算符 << 重载
自定义类中定义
分析
类外定义
解放方案1
解决方案2
优化->令其支持连续的流插入
流提取自定义类型
总结
在我们刚开始学c++时,cin 提取和 cout 插入 ,可以直接识别类型,这个规则是需要我们记住的,方便我们的输入和输出。
那么他们是怎么实现的呢?为何可以直接识别类型呢?
在这里给大家推荐非常好用的网站,有什么c++上的问题,都可以在上面查找
cplusplus.com - C++资源网络
实际上cin 和 cout 相当于由 istream 和 ostream 创建的对象。
可以说istream相当于库中已经定义好的一个类,而 cin 是跟据输入流创建好的对象:
输入流对象可以读取和解释字符序列中的输入,提供了特定成员来执行这些输入操作
有了可以读取并解释输入,如何执行输入?
相当于现在有想要输入的值,cin 可以识别这个值,并将其提取到相应的类型变量中。
怎么样将 cin 和变量相联系起来:
这个桥梁就是流提取操作符。
>> 在我们以前的印象中是右移运算符,但在这里却摇身一变为 流提取操作符。这是为什么?
这里就是用到了运算符重载,令它可以进行如上操作。
但是我们发现它不需要进行数据格式控制,可以自动识别类型
没有c语言那么繁琐:整形--%d,字符--%c ……
原因是:运算符重载+函数重载:
相应的,ostream也是库中定义好的一个类,cout 为其创建的对象:
输出流对象可以写入字符序列并表示其他类型的数据。提供了特定成员来执行这些输出操作
意思就是,将已有的内置类型数据插入到对象 cout中, cout 识别后输出到显示屏上。
与输入流相对应,变量和 cout 间的桥梁是 流插入运算符 <<
<< 原本应该是左移运算符,因此 << 也是被重载了
使用它也不需要进行数据格式的控制,因此不止被重载一次:
cin 和 cout 是用输入流和输出流创建好的对象
cin 和 流提取运算符 >> 一起使用
cout 和 流插入运算符 << 一起使用
输入输出不用进行数据格式的控制的原因是:
对应输入流输出流中的成员函数已经对操作符进行了运算符重载+函数重载,因此可以实现对内置类型的自动识别
上篇《日期类的实现》中:日期类的实现_i跑跑的博客-CSDN博客
我们对运算符重载有了很深的印象及基本的运用。那么当我们定义并创建好一个对象后,能否对此对象直接进行输入或着输出?
因此,我们应该现在类中定义属于我们自定义类型 日期类的 流插入运算符。
我们首先要明确,函数的参数是两个 ,一个是参数的类型是输出流,另一个参数是要输出的对象,由上面的对比可以得出。
而在类中定义的话,有一个隐含的 this 指针,指向的就是要输出的对象,因此我们要传的参数只有一个:输出流对象
形参的顺序不对!! 那么使用的两个对象的使用位置也不一样,交换使用位置即可:
首先我们得知道:内置类型输出时, 流插入运算符是定义在输出流中的:
而在自定义类型中,成员函数(operator<<)不在cout对象中,而在自定义类型中:
因此我们只要解决重载函数中,第一个形参是输出流类型即可。类中定义的函数默认第一个形参是this指针,不可更改,那么我们就需要将运算符重载定义在类外即可。
在类中添加获取数据成员的函数:
设置友元函数:
友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。
通过开头我们看到的库中的流提取插入的运算符重载,我们不难发现他们有一个返回值,返回值的类型是输入流或者输出流,这是支持连续插入或连续输出的原因。
cout<
cout<
不会产生任何影响:
这样自定义类型的流插入就完成了同理,也可以写出自定义类型流提取的运算符重载:
对自定义类型进行流提取和流插入操作符的重在时,要与内置类型用法相同:
在类外定义
函数传参第一个参数应为输入流或输出流类型
第二个参数为自定义的类型
返回为输入流和输出流,可支持连续提取和插入