首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于操作符<<重载的有关问题

2012-02-29 
关于操作符重载的问题classTime{private:inthoursintminutespublic:Time()Time(inth0,intm0)voidr

关于操作符<<重载的问题
class   Time
  {
        private   :
            int   hours   ;
            int   minutes   ;
        public     :
            Time();
            Time(   int   h   =   0   ,   int   m   =   0   );
            void   reset   (){   hours   =   minutes   =   0;}
            friend   Time   operator+(   const   Time   &   a   ,   const   Time   &   b   );   //定义了时间加法
            friend   std::ostream   &   operator < <(   std::ostream   &   s   ,   const   Time   &   t   );     //可以用cout输出时间
  };

重载+后,可以直接进行时间加法.如Time的对象t1,t2,t3,可以:
t3   =   t1+t2;
相当于   t3=t1.operator+(t2);

那么 < <,应该是cout < <(cout,t4),就是cout.operator(cout,t4),这样输出是正常的。
可为什么cout < <t4也可以呢?cout是调用对象而不是参数呀?参数在 < <右边呀?

[解决办法]
这个理解是错的:
那么 < <,应该是cout < <(cout,t4),就是cout.operator(cout,t4),这样输出是正常的。
[解决办法]
cout < < "Time " < <T4;
相当于

operator < <(operator < <(cout, "Time "),t4);//函数的链式调用,operator < <返回cout的引用

[解决办法]
链式调用
[解决办法]
friend const Time operator+( const Time & a , const Time & b )
//返回const类型 防止 time1+time2=time3的情况

time1=time2+time3时,
Time operator+(const Time & t)const 要求time2为Time类型,
而如果加号重载为friend const Time operator+( const Time & a , const Time & b ),
则time2可以不为Time类型,为字符串或其他类型也可以,只要有构造函数可以将time2转成Time类型就可以了,系统会自动转换。

[解决办法]
对于操作符重载,C++规定就是这样的,+是2元操作符,当t1+t2时,Time operator+(const Time & t)const会转成t1.operator +(t2)的形式,对于其他的操作符,如(),[]具体形式其实都是由内定的重载形式的。

热点排行
Bad Request.