下面以自增運算符”++“爲例,介紹單目運算符的重載。
[例10.5] 有一個Time類,包含數據成員minute(分)和sec(秒),模擬秒錶,每次走一秒,滿60秒進一分鐘,此時秒又從0開始算。要求輸出分和秒的值。
- #include <iostream>
- using namespace std;
- class Time
- {
- public:
- Time( ){minute=0;sec=0;} //默認構造函數
- Time(int m,int s):minute(m),sec(s){ } //構造函數重載
- Time operator++( ); //聲明運算符重載函數
- void display( ){cout<<minute<<":"<<sec<<endl;} //定義輸出時間函數
- private:
- int minute;
- int sec;
- };
- Time Time::operator++( ) //定義運算符重載函數
- {
- if(++sec>=60)
- {
- sec-=60; //滿60秒進1分鐘
- ++minute;
- }
- return *this; //返回當前對象值
- }
- int main( )
- {
- Time time1(34,0);
- for (int i=0;i<61;i++)
- {
- ++time1;
- time1.display( );
- }
- return 0;
- }
34:1
34:2
┆
34:59
35:0
35:1 (共輸出61行)
可以看到:在程序中對運算符“++”進行了重載,使它能用於Time類對象。“++”和“--”運算符有兩種使用方式,前置自增運算符和後置自增運算符,它們的作用是不一樣的,在重載時怎樣區別這二者呢?
針對“++”和“--”這一特點,C++約定,在自增(自減)運算符重載函數中,增加一個int型形參,就是後置自增(自減)運算符函數。
[例10.6] 在例10.5程序的基礎上增加對後置自增運算符的重載。修改後的程序如下:
- #include <iostream>
- using namespace std;
- class Time
- {
- public:
- Time( ){minute=0;sec=0;}
- Time(int m,int s):minute(m),sec(s){}
- Time operator++( );//聲明前置自增運算符“++”重載函數
- Time operator++(int);//聲明後置自增運算符“++”重載函數
- void display( ){cout<<minute<<":"<<sec<<endl;}
- private:
- int minute;
- int sec;
- };
- Time Time::operator++( )//定義前置自增運算符“++”重載函數
- {
- if(++sec>=60)
- {
- sec-=60;
- ++minute;
- }
- return *this;//返回自加後的當前對象
- }
- Time Time::operator++(int)//定義後置自增運算符“++”重載函數
- {
- Time temp(*this);
- sec++;
- if(sec>=60)
- {
- sec-=60;
- ++minute;
- }
- return temp; //返回的是自加前的對象
- }
- int main( )
- {
- Time time1(34,59),time2;
- cout<<" time1 : ";
- time1.display( );
- ++time1;
- cout<<"++time1: ";
- time1.display( );
- time2=time1++; //將自加前的對象的值賦給time2
- cout<<"time1++: ";
- time1.display( );
- cout<<" time2 :";
- time2.display( ); //輸出time2對象的值
- }
請注意前置自增運算符“++”和後置自增運算符“++”二者作用的區別。前者是先自加,返回的是修改後的對象本身。後者返回的是自加前的對象,然後對象自加。請仔細分析後置自增運算符重載函數。
運行結果如下:
time1 : 34:59(time1原值)
++time1: 35:0 (執行++time1後time1的值)
time1++: 35:1 (再執行time1++後time1的值)
time2 : 35:0 (time2保存的是執行time1++前time1的值)
可以看到,重載後置自增運算符時,多了一個int型的參數,增加這個參數只是爲了與前置自增運算符重載函數有所區別,此外沒有任何作用。編譯系統在遇到重載後置自增運算符時,會自動調用此函數。