没有合适的资源?快使用搜索试试~ 我知道了~
C++的iostream标准库介绍以及对左移与右移运算符的重载.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 46 浏览量
2023-02-27
20:06:58
上传
评论
收藏 677KB PDF 举报
温馨提示
试读
18页
.
资源推荐
资源详情
资源评论
我们从一开始就一直在利用 C++的输入输出在做着各种练习,输入输出是由
iostream 库提供的,所以讨论此标准库是有必要的,它与 C 语言的 stdio 库不同,
它从一开始就是用多重继承与虚拟继承实现的面向对象的层次结构,作为一个
c++的标准库组件提供给程序员使用。
iostream 为内置类型类型对象提供了输入输出支持,同时也支持文件的输
入输出,类的设计者可以通过对 iostream 库的扩展,来支持自定义类型的输入输
出操作。
为什么说要扩展才能提供支持呢?我们来一个示例。
C++ 代码
#include
#include <iostream>
using namespace std;
class Test
{
public:
Test(int a=0,int b=0)
{
Test::a=a;
Test::b=b;
}
int a;
int b;
};
int main()
{
Test t(100,50);
printf("%???",t);//不明确的输出格式
scanf("%???",t);//不明确的输入格式
cout<//同样不够明确
cin>>t;//同样不够明确
system("pause");
}
由于自定义类的特殊性,在上面的代码中,无论你使用 c 风格的输入输出,或
者是 c++的输入输出都不是不明确的一个表示,由于 c 语言没有运算符重载机制,
导致 stdio 库的不可扩充性,让我们无法让 printf()和 scanf()支持对自定义类
对象的扩充识别,而 c++是可以通过运算符重载机制扩充 iostream 库的,使系统
能能够识别自定义类型,从而让输入输出明确的知道他们该干什么,格式是什么。
在上例中我们之所以用 printf 与 cout 进行对比目的是为了告诉大家,C 与
C++处理输入输出的根本不同,我们从 c 远的输入输出可以很明显看出是函数调
用方式,而 c++的则是对象模式,cout 和 cin 是 ostream 类和 istream 类的对象。
C++中的 iostream 库主要包含下图所示的几个头文件:
我们所熟悉的输入输出操作分别是由 istream(输入流)和 ostream(输出流)
这两个类提供的,为了允许双向的输入/输出,由 istream 和 ostream 派生出了
iostream 类。
类的继承关系见下图:
iostream 库定义了以下三个标准流对象:
1.cin,表示标准输入(standard input)的 istream 类对象。cin 使我们可以
从设备读如数据。
2.cout,表示标准输出(standard output)的 ostream 类对象。cout 使我们
可以向设备输出或者写数据。
3.cerr,表示标准错误(standard error)的 osttream 类对象。cerr 是导出
程序错误消息的地方,它只能允许向屏幕设备写数据。
输出主要由重载的左移操作符(<<)来完成,输入主要由重载的右移操作符
(>>)完成。
>>a 表示将数据放入 a 对象中。
<
这些标准的流对象都有默认的所对应的设备,见下表:
图中的意思表明 cin 对象的默认输入设备是键盘,cout 对象的默认输出设备
是显示器屏幕。
那么原理上 C++有是如何利用 cin/cout 对象与左移和右移运算符重载来实
现输入输出的呢?
下面我们以输出为例,说明其实现原理:
cout 是 ostream 类的对象,因为它所指向的是标准设备(显示器屏幕),所以
它在 iostream 头文件中作为全局对象进行定义。
ostream cout(stdout);//其默认指向的 C 中的标准设备名,作为其构造函数
的参数使用。
在 iostream.h 头文件中,ostream 类对应每个基本数据类型都有其友元函数
对左移操作符进行了友元函数的重载。
ostream& operator<<(ostream &temp,int source);
ostream& operator<<(ostream &temp,char *ps);
。。。。等等
一句输出语句:cout<<"www.cndev-lab.com";,事实上调用的就是 ostream&
operator<<(ostream &temp,char *ps);这个运算符重载函数,由于返回的是流对
象的引用,引用可以作为左值使用,所以当程序中有类似
cout<<"www.cndev-lab.com"<<"中国软件开发实验室";这样的语句出现的时候,
就能够构成连续输出。
由于 iostream 库不光支持对象的输入输出,同时也支持文件流的输入输出,
所以在详细讲解左移与右移运算符重载只前,我们有必要先对文件的输入输出以
及输入输出的控制符有所了解。
和文件有关系的输入输出类主要在 fstream.h 这个头文件中被定义,在这个
头文件中主要被定义了三个类,由这三个类控制对文件的各种输入输出操作,他
们分别是 ifstream、ofstream、fstream,其中 fstream 类是由 iostream 类派生
而来,他们之间的继承关系见下图所示。
由于文件设备并不像显示器屏幕与键盘那样是标准默认设备,所以它在
fstream.h 头文件中是没有像 cout 那样预先定义的全局对象,所以我们必须自己
定义一个该类的对象,我们要以文件作为设备向文件输出信息(也就是向文件写
数据),那么就应该使用 ofstream 类。
ofstream 类的默认构造函数原形为:
ofstream::ofstream(const char *filename,int mode = ios::out,int
openprot = filebuf::openprot);
filename: 要打开的文件名
mode: 要打开文件的方式
prot: 打开文件的属性
其中 mode 和 openprot 这两个参数的可选项表见下表:
剩余17页未读,继续阅读
资源评论
xxpr_ybgg
- 粉丝: 6449
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- kernel-ml-6.8.8-1.el7.elrepo.x86-64.rpm
- Labview基本框架之状态机
- HM2309B-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- Git安全实践:保护你的代码仓库个人学习笔记.md
- 自动驾驶定位系列教程九:后端优化.pdf
- 三国志5威力加强版-windows
- HM2309A-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- HM2306-VB一款N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- Git进阶技巧:提升团队协作效率个人学习笔记.md
- 自动驾驶定位系列教程八:建图系统结构优化.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功