有一个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次走1秒,满60秒进1分钟,此时秒又从0起算,要求输出分和秒的值,用重载的运算符“<<“输出复数

编写程序:

运行结果:

        可以看到在对运算符"<<"重载后,在程序中用"<<"不仅能输出标准类型数据,而且可以输出用户自己定义的类对象。本题是用"<<"输出复数类对象,用"cout<<c3"即能以复数形式输出复数对象c3的值。形式直观,可读性好,易于使用。
        下面对怎样实现运算符重载做一些说明。程序中重载了运算符"<<",运算符重载函数" operator<<"中的形参output是ostream类对象的引用,形参名output是用户任意起的。分析main函数最后第2行:
        cout<<c3;
运算符"<<"的左面是cout,前面已提到cout是在头文件iostream中声明的ostream类对象。"<<"的右面是c3,它是Complex类对象。由于已将运算符"<<"的重载函数声明为Complex类的友元函数,编译系统把cout<<c3解释为
        operator<<(cout,c3)
即以cout和c3作为实参,调用下面的"operator<<"函数:
        ostream& operator<<( ostream& output,Complex&c)
        {output<<"("<<c.real<<"+"<<c.imag<<"i)"<<endl;
         return output;}
调用函数时,形参output成为实参cout的引用,形参c成为c3的引用。因此调用函数的过程相当于执行
        cout<<"("<<c3.real<<"+"<<c3.imag<<"i)"<<endl; return cout;
注意:上一行中的"<<"是C++预定义的流插入符,因为它右侧的操作数是字符串常量和double类型数据。执行上面的cout语句就会输出复数形式的信息。然后执行return语句。
刚才是在执行
        cout<<c3;
现在已知cout<<c3的返回值是cout的当前值。如果有以下输出:
        cout<<c3<<c2;
先处理cout<<c3,即
        (cout<<c3)<<c2;
而执行(cout<<c3)得到的结果就是具有新内容的流对象cout,因此,(cout<<c3)<<c2相当于cout(新值)<<c2。运算符"<<"左侧是ostream类对象cout,右侧是Complex类对象c2,则再次调用运算符"<<"重载函数,接着向输出流插入c2的数据。现在可以理解为什么C++规定运算符"<<"重载函数的第1个参数和函数的类型都必须是ostream类型的引用,就是为了返回cout的当前值以便连续输出。
        请读者注意区分什么情况下的"<<"是标准类型数据的流插入符,什么情况下的"<<"是重载的流插入符。如
        cout<<c3<<5<<endl;
有下画线的是调用重载的流插入符,后面两个"<<"不是重载的流插入符,因为它的右侧不是Complex类对象而是标准类型的数据,是用预定义的流插入符处理的。
        还有一点要说明:在本程序中,在Complex类中定义了运算符"<<"重载函数为友元函数,因此只有在输出Complex类对象时才能使用重载的运算符,对其他类型的对象是无效的。如
        cout<<time1;        //time1是Time类对象,不能使用用于Complex类的重载运算符

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值