重载流输入、输出运算符
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