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型的參數,增加這個參數只是爲了與前置自增運算符重載函數有所區別,此外沒有任何作用。編譯系統在遇到重載後置自增運算符時,會自動調用此函數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章