C++输入输出操作符重载
2015-11-18 09:35
393 查看
1. 输入输出操作符简介
C++中输入操作符是>>,输出操作符是<<,又叫做流对象的“插入操作符”和“提取操作符“。其实这两个操作符最初是在C语言中用于整数的移位运算,到了C++中才利用操作符重载的技术将它们应用于输入、输出操作。2.重载的原因
应用于基本类型的输入、输出操作都已经在C++标准库中定义好,没有必要重新定义,也不允许重新定义。而对于用户自定义类来说,如果想利用输入、输出操作符进行本类对象的输入、输出操作,就需要对<<和>>操作符进行重载。3.重载的形式
对输出操作<<进行重载,只能采用友元函数的形式进行,而不能将operator<<()申明为ostream类的成员函数。这是因为ostream是在C++标准中定义的类,不允许用户随便修改。所以,要将类someClass的对象输出到标准输出对象,只能采用将operator<<()重载为全局函数,申明为someClass类的友元的形式进行。而且,这时的输出操作符函数原型下述五种形式之一:ostream& operator<<(ostream&,const someClass&); 或者 ostream& operator<<(ostream&,const someClass*); ostream& operator<<(ostream&, someClass&); 或者 ostream& operator<<(ostream&, someClass*); ostream& operator<<(ostream&, someClass);
其一,第一种形式最好,也是最常用的。这种函数重载,既安全又高效。
对于输入操作符>>进行重载,也是能采用友元函数的形式进行,而不能讲operator>>()申明为istream类的成员函数。这是因为istream也是C++标准库的类,也不能被用户随意修改。所以,要从标准输入对象将数据读入类someClass的对象中,只能采用operator>>()重载为全局函数,且申明为someClass类的友元的形式。输入操作符函数原型一定是:
istream& ostream>>(istream&,someClass&); 或者 istream& ostream>>(istream&,someClass*);
4.重载的示例
下面是输入和、输出操作符的例子。#include <iostream> using namespace std; class Complex{ double real; double image; public: Complex(double r=0.0,double i=0.0){ real=r; image=i; } friend ostream& operator<<(ostream&,const Complex&); friend istream& operator>>(istream&,Complex&); }; ostream& operator<<(ostream& o,const Complex& c){ o<<c.real<<"+"<<c.image<<"i"; return o; } istream& operator>>(istream& i,Complex& c){ bool success=false; char ch; while(!success){ cout<<"please input a complex:"<<endl; i>>c.real; i>>ch; if(ch!='+'){ //cin.clear(); //清除错误标志 //cin.ignore(numeric_limits<std::streamsize>::max(),'\n'); //清除缓冲区的当前行 continue; } i>>c.image; i>>ch; if(ch!='i'){ //cin.clear(); //清除错误标志 //cin.ignore(numeric_limits<std::streamsize>::max(),'\n'); //清除缓冲区的当前行 continue; } else success=true; } return i; } int main(int argc, char* argv[]) { Complex c; cin>>c; cout<<c; return 0; }
从键盘键入3.4+5.6i然后回车,程序的运行结果是:
please input a complex:
3.4+5.6i
3.4+5.6i
阅读以上程序,要注意以下几点。
(1)对于输入输出操作符进行重载,只能采用友元函数的形式,而不能采用成员函数的形式,原因前面已经讲述。
(2)如果将输入操作符函数申明为:
ostream operator<<(ostream,const Complex&);
或者将输入操作符申明为:
istream operator>>(istream,Complex&);
都会产生编译错误。原因是istream类和ostream类的拷贝构造函数被申明为私有(private)成员,这样实际上就阻止了istream类型和ostream类型的参数的传值行为,也就阻止了他们成为函数的返回值。
(3)格式化的输出操作比较容易实现,因为输出的内容已经准备好,如何输出完全由程员来安排。而格式化的输入操作要复杂一些,因为输入的内容事先是不知道的,用户在输入数据的过程中可能会存在违反约定的行为。所以,在格式化输入函数中通常还要加入一些容错的处理。
在上面的程序中,对用户输入的内容的错误性判断还不是特别完善,有兴趣的读者可以自行改进或将程序中continue语句前的两行注释取消,可提高输入的容错性。关于cin的详细用法见我的另一篇blog cin的详细用法。
参考文献
[1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[4.7(P320-P322)]相关文章推荐
- C++输入输出操作符重载
- 【c++】公司职员系统
- 【C++】多态的实现原理
- 单片机C语言代码-代码格式
- C语言之指针高级
- 查询词提示系统的简单实现
- c语言:3种方法;求出0~999之间的所有“水仙花数”并输出。
- 【C】关于C语言数组的总结(1)
- C++ 运算符优先级
- 解决在 WP8/ WP8.1 项目中 引用 C++ 组件时出现的 System.TypeLoadException 错误
- c++ 默认构造函数,构造函数,复制构造函数,赋值操作符,析构函数调用示例
- C++map遍历删除数据(删除被2整除的键值对)
- 回车与换行的区别
- c++使用winsocket创建UDP
- cin 和 getchar()
- C语言练习作业(四)
- 绝不重新定义继承而来的缺省参数值--from Effective c++ item 37
- 【重回C】c语言之顺序表的部分基本操作
- 一起talk C栗子吧(第六十二回:C语言实例--字符串比较)
- 对指针的进一步理解