C++的流插⼊运算符“<<”和流提取运算符“>>”是C++在类库中提供的,所有C++编译系统都在类库中提供输⼊流类istream和输出流类ostream。cin和cout分别是istream类和ostream类的对象。在类库提供的头⽂件中已经对“<<”和“>>”进⾏了重载,使之作为流插⼊运算符和流提取运算符,能⽤来输出和输⼊C++标准类型的数据。因此,凡是⽤“cout<<”和“cin>>”对标准类型数据进⾏输⼊输出的,都要⽤#include 把头⽂件包含到本程序⽂件中。
⽤户⾃⼰定义的类型的数据,是不能直接⽤“<<”和“>>”来输出和输⼊的。如果想⽤它们输出和输⼊⾃⼰声明的类型的数据,必须对它们重载。
对“<<”和“>>”重载的函数形式如下:
istream & operator >> (istream &, ⾃定义类 &); ostream & operator << (ostream &, ⾃定义类 &);
即重载运算符“>>”的函数的第⼀个参数和函数的类型都必须是istream&类型,第⼆个参数是要进⾏输⼊操作的类。重载“<<”的函数的第⼀个参数和函数的类型都必须是ostream&类型,第⼆个参数是要进⾏输出操作的类。因此,只能将重载“>>”和“<<”的函数作为友元函数或普通的函数,⽽不能将它们定义为成员函数。重载流插⼊运算符“<<”
在程序中,⼈们希望能⽤插⼊运算符“<<”来输出⽤户⾃⼰声明的类的对象的信息,这就需要重载流插⼊运算符“<<”。[例] ⽤重载的“<<”输出复数。
#include public: Complex( ){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} Complex operator + (Complex &c2); //运算符“+”重载为成员函数 friend ostream& operator << (ostream&,Complex&); //运算符“<<”重载为友元函数 private: double real; double imag;}; Complex Complex::operator + (Complex &c2)//定义运算符“+”重载函数{ return Complex(real+c2.real,imag+c2.imag);} ostream& operator << (ostream& output,Complex& c) //定义运算符“<<”重载函数{ output<<\"(\"< Complex c1(2,4),c2(6,10),c3; c3=c1+c2; cout< (8+14i) 可以看到在对运算符“<<”重载后,在程序中⽤“<<”不仅能输出标准类型数据,⽽且可以输出⽤户⾃⼰定义的类对象。⽤“cout< cout< 重载函数声明为Complex类的友元函数,编译系统把“cout< 即以cout和c3作为实参,调⽤下⾯的operator<<函数: ostream& operator<<(ostream& output,Complex& c) { output<<\"(\"< cout<<″(″< 请思考,return output的作⽤是什么?回答是能连续向输出流插⼊信息。output是ostream类的对象,它是实参cout的引⽤,也就是cout通过传送地址给output,使它们⼆者共享同⼀段存储单元,或者说output是cout的别名。因此,return output就是return cout,将输出流cout的现状返回,即保留输出流的现状。请问返回到哪⾥?刚才是在执⾏ cout< cout< (cout< cout< 还有⼀点要说明,在本程序中,在Complex类中定义了运算符“<<”重载函数为友元函数,因此只有在输出Complex类对象时才能使⽤重载的运算符,对其他类型的对象是⽆效的。如 cout< C++预定义的运算符“>>”的作⽤是从⼀个输⼊流中提取数据,如“cin>>i;”表⽰从输⼊流中提取⼀个整数赋给变量i(假设已定义i为int型)。重载流提取运算符的⽬的是希望将“>>”⽤于输⼊⾃定义类型的对象的信息。 [例] 在上例的基础上,增加重载流提取运算符“>>”,⽤“cin>>”输⼊复数,⽤“cout<<”输出复数。 #include public: friend ostream& operator << (ostream&,Complex&); //声明重载运算符“<<” friend istream& operator >> (istream&,Complex&); //声明重载运算符“>>” private: double real; double imag;}; ostream& operator << (ostream& output,Complex& c) //定义重载运算符“<<”{ output<<\"(\"< cout<<\"input real part and imaginary part of complex number:\"; input>>c.real>>c.imag; return input;} int main( ){ Complex c1,c2; cin>>c1>>c2; cout<<\"c1=\"< input real part and imaginary part of complex number:3 6↙input real part and imaginary part of complex number:4 10↙c1=(3+6i)c2=(4+10i) 以上运⾏结果⽆疑是正确的,但并不完善。在输⼊复数的虚部为正值时,输出的结果是没有问题的,但是虚部如果是负数,就不理想,请观察输出结果。 input real part and imaginary part of complex number:3 6↙input real part and imaginary part of complex number:4 -10↙c1=(3+6i)c2=(4+-10i) 根据先调试通过,最后完善的原则,可对程序作必要的修改。将重载运算符“<<”函数修改如下: ostream& operator << (ostream& output,Complex& c){ output<<\"(\"< output< 可以看到,在C++中,运算符重载是很重要的、很有实⽤意义的。它使类的设计更加丰富多彩,扩⼤了类的功能和使⽤范围,使程序易于理解,易于对对象进⾏操作,它体现了为⽤户着想、⽅便⽤户使⽤的思想。有了运算符重载,在声明了类之后,⼈们就可以像使⽤标准类型⼀样来使⽤⾃⼰声明的类。类的声明往往是⼀劳永逸的,有了好的类,⽤户在程序中就不必定义许多成员函数去完成某些运算和输⼊输出的功能,使主函数更加简单易读。好的运算符重载能体现⾯向对象程序设计思想。可以看到,在运算符重载中使⽤引⽤(reference)的重要性。利⽤引⽤作为函数的形参可以在调⽤函数的过程中不是⽤传递值的⽅式进⾏虚实结合,⽽是通过传址⽅式使形参成为实参的别名,因此不⽣成临时变量(实参的副本),减少了时间和空间的开销。此外,如果重载函数的返回值是对象的引⽤时,返回的不是常量,⽽是引⽤所代表的对象,它可以出现在赋值号的左侧⽽成为左值(left value),可以被赋值或参与其他操作(如保留cout流的当前值以便能连续使⽤“<<”输出)。但使⽤引⽤时要特别⼩⼼,因为修改了引⽤就等于修改了它所代表的对象。 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- awee.cn 版权所有 湘ICP备2023022495号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务