用户自定义的类型的数据,是不能直接用“<<”和“>>”来输出和输入的。如果想用他们输出和输入自己声明的类型的数据,必须对他们进行重载。
“<<”和“>>”重载函数形式如下:
istream& operator>>(istream&,自定义类型&);
ostream& operator <<(ostream&,自定义类型&);
注意:只能将重载“>>”和“<<”的函数作为友元函数或普通函数,而不能将他们定义为成员函数。
#include <iostream>
using namespace std;
class Complex
{
public:
Complex(){real=0;image=0;}
Complex(double r,double i){real=r;image=i;}
Complex operator+(Complex &c2); //“+”运算符重载为成员函数
friend ostream& operator<<(ostream&,Complex &c); //“<<”运算符重载为友元函数,注意:不能重载为类成员函数
private: //只能重载为友元函数或者普通函数
double real;
double image;
};
Complex Complex::operator +(Complex &c2)
{
Complex c;
c.real=real+c2.real;
c.image=image+c2.image;
return c;
}
ostream& operator<<(ostream &output,Complex &c) //定义运算符“<<”的重载函数
{
output<<"("<<c.real<<"+"<<c.image<<"i)"<<endl; //记住
return output;
}
int main()
{
Complex c1(2,4),c2(6,20),c3;
c3=c1+c2;
cout<<c3; //可以解释为operator<<(cout,c3);
return 0;
}
return output的作用是什么?回答是能连续向输出流插入信息,output是ostream类得对象,他是实参cout的引用,也可以说是cout的别名,共享同一段存储单元。因此,return output就是return cout,将输出流cout的现状返回,即保留输出流的现状。
cout<<c3<<c2所以可以理解为:(cout<<c3)<<c2
执行(cout<<c3)得到的结果就是具有新内容的流对象cout,(cout<<c3)<<c2相当于cout(新值)<<c2,然后再次重载运算符“<<”。现在可以理解了为什么C++规定运算符“<<”重载函数为什么第一个参数和函数类型都必须是ostream类型的引用,就是为了返回cout的当前值以便连续输出。