C++中输入输出流运算符的重载
2016-04-29 16:00
302 查看
cout是ostream类的对象,cin是istream类的对象。
我们平时用的cout<<就相当于cout.operator<<(...)。也就是说正常使用(不对operator<<进行函数重载,我们用的都是ostream类库中本身定义好了函数)
而当我们需要对cout<<进行重载时,比如我们定义了一个类Student,他的一个对象s1,我们想要cout<<s1,这时<<的意义就改变了,由于ostream类库中已经定义好的成员函数我们是不能改写的,因此我们只能将<<重载成一个全局函数。
ex:
关于这个函数,有两点值得思考:
(1)它的返回值,是这样理解的:
在我们输出了一个5以后返回的是调用第一个<<的对象的引用,即相当于第一个cout,我们就可以接着连续的用同一个cout来调用第二个<<函数了。
(2)参数中引用的s对象,以及在函数体中直接调用s.sname,是需要我们把该函数设置成Student类的友元类的,这样该函数就相当于Student类的成员函数,可以直接访问到Student类的成员变量。
我们平时用的cout<<就相当于cout.operator<<(...)。也就是说正常使用(不对operator<<进行函数重载,我们用的都是ostream类库中本身定义好了函数)
而当我们需要对cout<<进行重载时,比如我们定义了一个类Student,他的一个对象s1,我们想要cout<<s1,这时<<的意义就改变了,由于ostream类库中已经定义好的成员函数我们是不能改写的,因此我们只能将<<重载成一个全局函数。
ex:
ostream& operator<<(ostream& co,const Student& s) { co<<s.sname<<endl; return co; }
关于这个函数,有两点值得思考:
(1)它的返回值,是这样理解的:
cout<<5<<"hello";
在我们输出了一个5以后返回的是调用第一个<<的对象的引用,即相当于第一个cout,我们就可以接着连续的用同一个cout来调用第二个<<函数了。
(2)参数中引用的s对象,以及在函数体中直接调用s.sname,是需要我们把该函数设置成Student类的友元类的,这样该函数就相当于Student类的成员函数,可以直接访问到Student类的成员变量。
相关文章推荐
- 【转】C++动态创建二维数组,二维数组指针
- (转)C++静态库与动态库
- C++拷贝构造函数详解
- 使用C++获取文件夹中所有文件名
- C# 调用C++ DLL 返回类型为字符的接口 出现异常 解决办法
- C语言如何不使用“+”号进行加法运算!
- Combination Sum III
- C语言_数组
- C语言_选择结构和循环结构
- C语言_基本类型
- Calling C/C++ functions from C#
- codeblocks 设置C99标准编译C文件
- 判断一个点在多边形内
- 零起点学通C语言选择什么样的书和方法
- C++学习笔记之八 复合类型---指针和自由存储空间
- 1019. General Palindromic Number (20)
- 重新学习《C++Primer5》第8章-IO库
- 苦学c语言(1)二维数组作为函数参数
- c++ primer(第五版)学习笔记及习题答案代码版(第三章)字符串、向量和数组
- C语言超大数除法,支持小数