自增
++
和自減
--
都是一元運算符,它的前置形式和後置形式都可以被重載。請看下面的例子:
#include <iostream>
#include <iomanip>
using namespace std;
//秒表類
class stopwatch{
public:
stopwatch(): m_min(0), m_sec(0){ }
public:
void setzero(){ m_min = 0; m_sec = 0; }
stopwatch run(); // 運行
stopwatch operator++(); //++i,前置形式
stopwatch operator++(int); //i++,後置形式
friend ostream & operator<<( ostream &, const stopwatch &);
private:
int m_min; //分鐘
int m_sec; //秒鐘
};
stopwatch stopwatch::run(){
++m_sec;
if(m_sec == 60){
m_min++;
m_sec = 0;
}
return *this;
}
stopwatch stopwatch::operator++(){
return run();
}
stopwatch stopwatch::operator++(int n){
stopwatch s = *this;
run();
return s;
}
ostream &operator<<( ostream & out, const stopwatch & s){
out<<setfill('0')<<setw(2)<<s.m_min<<":"<<setw(2)<<s.m_sec;
return out;
}
int main(){
stopwatch s1, s2;
s1 = s2++;
cout << "s1: "<< s1 <<endl;
cout << "s2: "<< s2 <<endl;
s1.setzero();
s2.setzero();
s1 = ++s2;
cout << "s1: "<< s1 <<endl;
cout << "s2: "<< s2 <<endl;
return 0;
}
運行結果:
s1: 00:00
s2: 00:01
s1: 00:01
s2: 00:01
上面的代碼定義了一個簡單的秒表類,m_min 表示分鐘,m_sec 表示秒鐘,setzero() 函數用於秒表清零,run() 函數是用來描述秒針前進一秒的動作,接下來是三個運算符重載函數。
先來看一下 run() 函數的實現,run() 函數一開始讓秒針自增,如果此時自增結果等於60了,則應該進位,分鐘加1,秒針置零。
operator++() 函數實現自增的前置形式,直接返回 run() 函數運行結果即可。
operator++ (int n) 函數實現自增的後置形式,返回值是對象本身,但是之後再次使用該對象時,對象自增了,所以在該函數的函數體中,先將對象保存,然後調用一次 run() 函數,之後再將先前保存的對象返回。在這個函數中參數n是沒有任何意義的,它的存在只是為了區分是前置形式還是後置形式。
自減運算符的重載與上面類似,這裡不再贅述。