14.7 重载>>和<<

    前面提及同高层I/O相比,流类库的优势在于可以对输入输出进行扩展,以满足自定义类型和结构的需要,本节给出插入符<<和抽取符>>的使用范例。

    14.7.1 插入符的重载

    在istream类中定义的操作符>>是作为成员方式重载的,如下例所示。


    cout<<5;等价于下述代码。 cout.operator<<(5);对自定义类型来说,操作符>>必须以友元方式进行使用,将ostream类对象的引用作为第一参数,将本类型的引用作为第二参数,同时为了实现链式输出,还要求返回ostream类的引用,来看一个具体的例子,定义了复数结构如下所示。 class Complex { private: double imag;//虚部 double real;//实部 public: Complex(double r=0.0,double i=0.0)//构造函数 { real=r; imag=i; } void disp() { cout<<real<<"+i*"<<imag<<endl; } };此时仅仅定义了其内部成员和构造函数,虽然disp函数可以用来输出诸如“2.5+i*3.1”之类的复数形式,但在程序中无法直观地使用流对象cout等来输入,即下列用法是非法的。 Complex c1(2.5,3.1); cout<<c1;

    编译器无法为Complex类对象找到合适的重载版本。所以,必须要在新定义的Complex类中重载<<操作符来满足需要,如代码14.25所示。

    代码14.25 重载<<操作符OperatorOverload1


    <———————————-文件名:example1425.cpp———————————————- 01 #include<iostream> 02 using namespace std; 03 class Complex 04 { 05 private: 06 double imag;//虚部 07 double real;//实部 08 public: 09 Complex(double r=0. 0,double i=0.0)//构造函数 10 { 11 real=r; 12 imag=i; 13 } 14 friend ostream&operator<<(ostream&,Complex&);//友元函数声明 15 }; 16 ostream&operator<<(ostream&os,Complex&C1)//对操作符<<的重载 17 { 18 os<<C1. real<<"+i*"<<C1.imag<<endl; 19 return os; 20 } 21 int main() 22 { 23 Complex c1(2. 5,3.1); 24 cout<<c1; 25 return 0; 26 }

    输出结果如下所示。


    2.5+i*3.1

    【代码解析】代码第16行,通过友元函数的形式对Complex类对象的<<操作进行了重载,实现了对流类库的扩充,使其满足需要。