遞增運算符(++)和遞減運算符(--)是C++語言中兩個重要的一元運算符。
/*** addMyself.cpp ***/ #include<iostream> using namespace std; class Time { private: int hours; int minutes; public: Time() { hours = 0; minutes = 0; } Time(int h,int m) { hours = h; minutes = m; } void displayTime() { cout << "H: " << hours << " M" << minutes << endl; } //重載前綴遞增運算符 Time operator++() { ++minutes; if(minutes >= 60) { ++hours; minutes -= 60; } return Time(hours,minutes); } //重載后綴遞增運算符 Time operator++(int) { Time T(hours,minutes); ++minutes; if(minutes >= 60) { ++hours; minutes -= 60; } return T; } }; int main() { Time T1(11,59),T2(10,40); ++T1; T1.displayTime(); ++T1; T1.displayTime(); T2++; T2.displayTime(); T2++; T2.displayTime(); return 0; }
運行結果:
exbot@ubuntu:~/wangqinghe/C++/20190808$ g++ addMyself.cpp -o addMyself
exbot@ubuntu:~/wangqinghe/C++/20190808$ ./addMyself
H: 12 M0
H: 12 M1
H: 10 M41
H: 10 M42
注意:int在括號是為了向編譯器說明這是一個后綴形式,而不是表示整數。
前綴形式重載調用Check operator++(),后綴形式重載調用operator++(int)
/*** addOver.cpp ***/ #include<iostream> using namespace std; class Check { private: int i; public: Check():i(0){}; Check operator++ () { Check temp; temp.i = ++i; return temp; } Check operator ++ (int) { Check temp; temp.i = i++; return temp; } void Display() { cout << "i = " << i << endl; } }; int main() { Check obj1,obj; obj.Display(); obj1.Display(); obj1 = ++ obj; obj.Display(); obj1.Display(); obj1 = obj++; obj.Display(); obj1.Display(); return 0; }
運行結果:
exbot@ubuntu:~/wangqinghe/C++/20190808$ ./addOver
i = 0
i = 0
i = 1
i = 1
i = 2
i = 1
遞減和遞增運算符重載:
- 遞增和遞減一般是對改變對象的狀態,所以一般是重載為成員函數。
- 重載遞增遞減,一定要和指針的遞增遞減區分。因為這里重載操作的是對象,而不是指針(由於指針是內置類型,指針的遞減遞增是無法重載的),所以一般情況的遞增遞減是操作對象內部的成員變量。
- 遞增和遞減分為前置和后置情況,a = ++b;(前置), a = b++。因為符號一樣,所以給后置版本加一個int形參作為區分。這個形參是0,但是在函數體中用不到,只是為了區分前置后置而已。