C++重载IO输入输出流运算符

重载流输入、输出运算符

C++对终端IO流的操作,封装了cout, cin等类。然后,这些类重载了“<<”和“>>”等运算符,实现对数据流的输入、输出操作。

那么,C++的流输入运算符“<<”和流提取运算符“>>”是C++在类库中提供的,所以C++编译系统都在类库中提供输入流istream和输出流ostream,cin和cout分别是istream类和ostream类的对象。在类库提供的头文件中已经对“<<”和“>>”进行了重载,使之作为流插入运算符流提取运算符,能用来输出和输入C++标准类型的数据。

用户自己定义的类型的数据,是不能直接用“<<”和“>>”来输出和输入的,如果想用它们输出和输入自己声明的类型的函数,必须对他们重载。

对“<<”和“>>”重载的函数形式如下:

istream& operator >> (istream&, 自定义类&);

ostream& operator << (ostream&, 自定义类&);

即重载“>>”运算符的第一个参数和函数返回类型都必须是 istream& 类型,第二个参数就是要进行输入操作的类。重载“<<”运算符的第一个参数和函数返回类型都必须是ostream& 类型,第二个参数是要进行输出操作的类。因此,只能将重载“>>”和“<<”的函数作为 友元 函数或普通的函数,而不能将它们定义为成员函数。

因为,对于“>>”和“<<” 运算符的左操作数是 cout 和 cin,假设有如下调用:

student stud; //student 是自己定义的一个类

cout << stud; //输出stud 对象

那么“<<”运算符的 左 操作数是 cout 对象,或者,“>>”运算符的左操作数是 cin对象。如果要把“<<”运算符定义为“成员函数”,也只能定义为 cout 对象的成员函数,那么,上面的调用,可以如下:

cout.operator << (stud); //是由cout 对象调用它自己的operator <<() 函数来操作

所以,要想重载 operator <<( ); 函数来操作 student 类,只能够把 operator <<(); 函数声明为student类的友元函数,或者定义为一个普通函数。不能把它定义为student类的一个成员函数。

对于一个问题还需要解释:根据重载的 operator <<(); 函数如下:

ostream& operator << (ostream&, 自定义类&);

我们看到,其返回类型是 ostream& ,是一个输出流对象的引用。在函数 operator <<( ); 操作完之后,为什么还要返回一个 ostream& 这样一个输出流对象的引用呢?看如下的一个输出语句就知道了:

int a = 162899;

cout << "a = " << a;

上面执行 cout 输出的时候,其实是调用了2个重载的 operator <<(); 函数:

(1) 首先执行cout << "a = " 来输出一个字符串“a = ”那么,调用:

ostream .operator <<(String) //重载函数是ostream 类的成员函数

operator <<(ostream, String) //重载函数不是ostream 的成员函数,但是,要接收2 个参数,第一个参数必须是ostream 类型,因为,我们执行cout << "a = " 语句的时候,"<<"运算符的左操作数是cout 对象,是ostream 类型,所以,该函数不是ostream 的成员函数,那么,第一个参数就是ostream 类型。所以,这两个函数,都可以实现 cout 输出字符串的操作。

所以,先输出流字符串“a = ”。

(2) 然后,再执行“ <<  a ”语句,它必须有如下的函数定义,才能够输出。

ostream .operatro <<(int)

operator <<(ostream, int)

所以,在“<< a”语句的左边,怎么样都必须要有一个 ostream 类型的对象,才能够顺利的完成“<< a”这样的操作。

所以,在执行“cout << “a = ””这样的语言之后,该函数必须返回一个 ostream 类对象,以支持后面继续输出“<< a”的操作。

所以,我们规定,在重载“<<”和“>>”操作符的时候,为了能够支持连续第使用该操作符,例如:

int a, double d, float f;

cin >> a >> d >> f; //输出数据

cout << a << d << f; //输出数据

那么,我们在重载了“<<”操作符之后,返回 ostream 类对象,在重载了“>>”操作符之后,返回istream类对象。


韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

韦凯峰Linux编程学堂

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

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

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

打赏作者

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

抵扣说明:

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

余额充值