C++重载流插入运算符和流提取运算符(2)

而执行(cout<<c3)得到的结果就是具有新内容的流对象cout,因此,(cout<<c3)<<c2相当于cout(新值)<<c2。运算符“<<”左侧是ostream类对象cout,右侧是Complex类对象c2,则再次调用运算符“<<”重载函数,接着向输出流插入c2的数据。现在可以理解了为什么C++规定运算符“<<”重载函数的第一个参数和函数的类型都必须是ostream类型的引用,就是为了返回cout的当前值以便连续输出。

请读者注意区分什么情况下的“<<”是标准类型数据的流插入符,什么情况下的“<<”是重载的流插入符。如

cout<<c3<<5<<endl;

有下划线的是调用重载的流插入符,后面两个“<<”不是重载的流插入符,因为它的右侧不是Complex类对象而是标准类型的数据,是用预定义的流插入符处理的。

还有一点要说明,在本程序中,在Complex类中定义了运算符“<<”重载函数为友元函数,因此只有在输出Complex类对象时才能使用重载的运算符,对其他类型的对象是无效的。如

cout<<time1;  //time1是Time类对象,不能使用用于Complex类的重载运算符

重载流提取运算符“>>”

C++预定义的运算符“>>”的作用是从一个输入流中提取数据,如“cin>>i;”表示从输入流中提取一个整数赋给变量i(假设已定义i为int型)。重载流提取运算符的目的是希望将“>>”用于输入自定义类型的对象的信息。

[例10.8] 在例10.7的基础上,增加重载流提取运算符“>>”,用“cin>>”输入复数,用“cout<<”输出复数。

#include <iostream>using namespace std;class Complex{public:friend ostream& operator << (ostream&,Complex&); //声明重载运算符“<<”friend istream& operator >> (istream&,Complex&); //声明重载运算符“>>”private:double real;double imag;};ostream& operator << (ostream& output,Complex& c) //定义重载运算符“<<”{output<<"("<<c.real<<"+"<<c.imag<<"i)";return output;}istream& operator >> (istream& input,Complex& c)  //定义重载运算符“>>”{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="<<c1<<endl;cout<<"c2="<<c2<<endl;return 0;}

运行情况如下:

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<<"("<<c.real;if(c.imag>=0) output<<"+";//虚部为正数时,在虚部前加“+”号output<<c.imag<<"i)"<<endl;  //虚部为负数时,在虚部前不加“+”号return output;}

这样,运行时输出的最后一行为c2=(4-10i) 。

可以看到,在C++中,运算符重载是很重要的、很有实用意义的。它使类的设计更加丰富多彩,扩大了类的功能和使用范围,使程序易于理解,易于对对象进行操作,它体现了为用户着想、方便用户使用的思想。有了运算符重载,在声明了类之后,人们就可以像使用标准类型一样来使用自己声明的类。类的声明往往是一劳永逸的,有了好的类,用户在程序中就不必定义许多成员函数去完成某些运算和输入输出的功能,使主函数更加简单易读。好的运算符重载能体现面向对象程序设计思想。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2ae3ef8e57c4d1579c24bc32ae4ea3c5.html