C++之单目运算符重载

单目运算符只有一个操作数,如!a,-b,&c,*p,还有最常用的++i和--i等。重载单目运算符的方法与重载双目运算符的方法是类似的。但由于单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员函数,则还可省略此参数。

下面以自增运算符”++“为例,介绍单目运算符的重载。

[例10.5] 有一个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次走一秒,满60秒进一分钟,此时秒又从0开始算。要求输出分和秒的值。

    
    
  1. #include <iostream>
  2. using namespace std;
  3. class Time
  4. {
  5. public:
  6. Time( ){minute=0;sec=0;} //默认构造函数
  7. Time(int m,int s):minute(m),sec(s){ } //构造函数重载
  8. Time operator++( ); //声明运算符重载函数
  9. void display( ){cout<<minute<<":"<<sec<<endl;} //定义输出时间函数
  10. private:
  11. int minute;
  12. int sec;
  13. };
  14. Time Time::operator++( ) //定义运算符重载函数
  15. {
  16. if(++sec>=60)
  17. {
  18. sec-=60; //满60秒进1分钟
  19. ++minute;
  20. }
  21. return *this; //返回当前对象值
  22. }
  23. int main( )
  24. {
  25. Time time1(34,0);
  26. for (int i=0;i<61;i++)
  27. {
  28. ++time1;
  29. time1.display( );
  30. }
  31. return 0;
  32. }
运行情况如下:
34:1
34:2

34:59
35:0
35:1 (共输出61行)

可以看到:在程序中对运算符“++”进行了重载,使它能用于Time类对象。“++”和“--”运算符有两种使用方式,前置自增运算符和后置自增运算符,它们的作用是不一样的,在重载时怎样区别这二者呢?

针对“++”和“--”这一特点,C++约定,在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自增(自减)运算符函数。

[例10.6] 在例10.5程序的基础上增加对后置自增运算符的重载。修改后的程序如下:

    
    
  1. #include <iostream>
  2. using namespace std;
  3. class Time
  4. {
  5. public:
  6. Time( ){minute=0;sec=0;}
  7. Time(int m,int s):minute(m),sec(s){}
  8. Time operator++( );//声明前置自增运算符“++”重载函数
  9. Time operator++(int);//声明后置自增运算符“++”重载函数
  10. void display( ){cout<<minute<<":"<<sec<<endl;}
  11. private:
  12. int minute;
  13. int sec;
  14. };
  15. Time Time::operator++( )//定义前置自增运算符“++”重载函数
  16. {
  17. if(++sec>=60)
  18. {
  19. sec-=60;
  20. ++minute;
  21. }
  22. return *this;//返回自加后的当前对象
  23. }
  24. Time Time::operator++(int)//定义后置自增运算符“++”重载函数
  25. {
  26. Time temp(*this);
  27. sec++;
  28. if(sec>=60)
  29. {
  30. sec-=60;
  31. ++minute;
  32. }
  33. return temp; //返回的是自加前的对象
  34. }
  35. int main( )
  36. {
  37. Time time1(34,59),time2;
  38. cout<<" time1 : ";
  39. time1.display( );
  40. ++time1;
  41. cout<<"++time1: ";
  42. time1.display( );
  43. time2=time1++; //将自加前的对象的值赋给time2
  44. cout<<"time1++: ";
  45. time1.display( );
  46. cout<<" time2 :";
  47. time2.display( ); //输出time2对象的值
  48. }

请注意前置自增运算符“++”和后置自增运算符“++”二者作用的区别。前者是先自加,返回的是修改后的对象本身。后者返回的是自加前的对象,然后对象自加。 请仔细分析后置自增运算符重载函数。

运行结果如下:
time1 : 34:59(time1原值)
++time1: 35:0 (执行++time1后time1的值)
time1++: 35:1 (再执行time1++后time1的值)
time2 : 35:0 (time2保存的是执行time1++前time1的值)

可以看到,重载后置自增运算符时,多了一个int型的参数,增加这个参数只是为了与前置自增运算符重载函数有所区别,此外没有任何作用。编译系统在遇到重载后置自增运算符时,会自动调用此函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值