C++ 運算符重載
明白了函數重載后,運算符的重載就是小意思了。
但是運算符的重載在實現起來有一定的規則。
First:雙目運算符
運算符重載為成員函數形式。
格式:類名 operator運算符(const 類名 &對象名) const{}
具體的還是看代碼吧。
View Code
#include "iostream" #include "cstring" #include "string" #include "cstdio" using namespace std; class Complex{ public: Complex(double r=0.0, double i=0.0):real(r),imag(i){} Complex operator+(const Complex &c2) const{ //重載"+" return Complex(real+c2.real, imag+c2.imag); } Complex operator-(const Complex &c2) const{ //重載"-" return Complex(real-c2.real, imag-c2.imag); } void display(){ cout<<"("<<real<<","<<imag<<")"<<endl; } private: double real; double imag; }; int main(){ Complex c1(5, 4), c2(2, 10), c3; cout<<"c1="; c1.display(); cout<<"c2="; c2.display(); c3 = c1+c2; cout<<"c3=c1+c2="; c3.display(); c3 = c1-c2; cout<<"c3=c1-c2="; c3.display(); }
Second:單目運算符
運算符重載為成員函數形式。
格式:類名& operator運算符(){} 或者 類名 operator運算符(int){}
具體的還是來看代碼。
View Code
#include "iostream" #include "cstring" #include "string" #include "cstdio" using namespace std; class Clock{ public: Clock(int hour=0, int minute=0, int second=0){ if(hour>=0 && hour<24 && minute>=0 && minute<60 && second>=0 && second<60){ this->hour = hour; this->minute = minute; this->second = second; }else cout<<"Time Error!"<<endl; } void showTime() const{ cout<<hour<<":"<<minute<<":"<<second<<endl; } Clock& operator++(){ //后置++, 只要是無參的,就是后置的,注意這里有& second++; if(second>=60){ second -= 60; minute++; if(minute>=60){ minute -= 60; hour = (hour+1)%24; } } return *this; } Clock operator++(int){ //前置++, 只要是有參的,就是前置的,注意這里沒& Clock old = *this; ++(*this); return old; } private: int hour; int minute; int second; }; int main(){ Clock myClock(23, 45, 56); cout<<"at first: "; myClock.showTime(); cout<<"myClock++: "; (myClock++).showTime(); cout<<"++myClock: "; (++myClock).showTime(); }
上面所講的都運算符重載為成員函數形式的重載,
下面來講講運算符重載為非成員函數形式的重載。
其實很簡單,就只要在重載函數前面加上一個friend可以了。
但是有一點要注意:在重載為成員函數時,省去了一個參數。
那么在重載為非成員函數時,每一個參數都要傳入了,不可以省。
還有一點就是要將修飾符const去掉。
好了,就這三點注意了。
再來總結一下:
1.加friend
2.每個參數都要傳入,不能省
3.去掉修飾符const
下面來看一個代碼吧。
View Code
#include "iostream" #include "cstring" #include "string" #include "cstdio" using namespace std; class Complex{ public: Complex(double r=0.0, double i=0.0):real(r),imag(i){} friend Complex operator+(const Complex &c1, const Complex &c2) { //重載"+" return Complex(c1.real+c2.real, c1.imag+c2.imag); } friend Complex operator-(const Complex &c1,const Complex &c2) { //重載"-" return Complex(c1.real-c2.real, c1.imag-c2.imag); } void display(){ cout<<"("<<real<<","<<imag<<")"<<endl; } private: double real; double imag; }; int main(){ Complex c1(5, 4), c2(2, 10), c3; cout<<"c1="; c1.display(); cout<<"c2="; c2.display(); c3 = c1+c2; cout<<"c3=c1+c2="; c3.display(); c3 = c1-c2; cout<<"c3=c1-c2="; c3.display(); }
posted on 2012-04-21 19:07 More study needed. 閱讀(211) 評論(0) 收藏 舉報

浙公網安備 33010602011771號