struct
node {
//定義一個結構體node(節點)
int
x;
int
y;
int
len;
//node中有3個成員變量x,y,len
bool
operator <(
const
node &a)
const
{
//重載<操做符。能夠對兩個node使用<操做符進行比較
return
len<a.len;
}
};
想必看到這裏對重載運算符算是有一丁點的瞭解吧,下面看些理論文字,更加清楚的瞭解關係!node
運算符重載時要遵循如下規則:函數
成員函數運算符性能
當運算符重載爲類的成員函數時,函數的參數個數比原來的操做數要少一個(後置單目運算符除外),這是由於成員函數用this指針隱式地訪問了類的一個對象,它充當了運算符函數最左邊的操做數。所以:this
友元函數運算符spa
當運算符重載爲類的友元函數時,因爲沒有隱含的this指針,所以操做數的個數沒有變化,全部的操做數都必須經過函數的形參進行傳遞,函數的參數與操做數自左至右一一對應。指針
兩種重載形式的比較code
在多數狀況下,將運算符重載爲類的成員函數和類的友元函數都是能夠的。但成員函數運算符與友元函數運算符也具備各自的一些特色:對象
在進行對象之間的運算時,程序會調用與運算符相對應的函數進行處理,因此運算符重載有兩種方式:成員函數和友元函數。成員函數的形式比較簡單,就是在類裏面定義了一個與操做符相關的函數。友元函數由於沒有this指針,因此形參會多一個。blog
1 class A 2 { 3 public: 4 A(int d):data(d){} 5 A operator+(A&);//成員函數 6 A operator-(A&); 7 A operator*(A&); 8 A operator/(A&); 9 A operator%(A&); 10 friend A operator+(A&,A&);//友元函數 11 friend A operator-(A&,A&); 12 friend A operator*(A&,A&); 13 friend A operator/(A&,A&); 14 friend A operator%(A&,A&); 15 private: 16 int data; 17 }; 18 //成員函數的形式 19 A A::operator+(A &a) 20 { 21 return A(data+a.data); 22 } 23 A A::operator-(A &a) 24 { 25 return A(data-a.data); 26 } 27 A A::operator*(A &a) 28 { 29 return A(data*a.data); 30 } 31 A A::operator/(A &a) 32 { 33 return A(data/a.data); 34 } 35 A A::operator%(A &a) 36 { 37 return A(data%a.data); 38 } 39 //友元函數的形式 40 A operator+(A &a1,A &a2) 41 { 42 return A(a1.data+a2.data); 43 } 44 A operator-(A &a1,A &a2) 45 { 46 return A(a1.data-a2.data); 47 } 48 A operator*(A &a1,A &a2) 49 { 50 return A(a1.data*a2.data); 51 } 52 A operator/(A &a1,A &a2) 53 { 54 return A(a1.data/a2.data); 55 } 56 A operator%(A &a1,A &a2) 57 { 58 return A(a1.data%a2.data); 59 } 60 //而後咱們就能夠對類的對象進行+、-、*、/了。 61 void main(void) 62 { 63 A a1(1),a2(2),a3(3); 64 a1=a2+a3; 65 //或者 66 a1=a2.operator+(a3); 67 }
注意:在進行a2+a3的時候會出錯,由於咱們在上面對+定義了兩種方法,去掉一種便可。接口
由於函數體比較簡單,後面我就只給出成員函數形式的函數聲明瞭,關係運算符有==,!=,<,>,<=,>=。
1 bool operator == (const A& ); 2 bool operator != (const A& ); 3 bool operator < (const A& ); 4 bool operator <= (const A& ); 5 bool operator > (const A& ); 6 bool operator >= (const A& );
1 bool operator || (const A& ); 2 bool operator && (const A& ); 3 bool operator ! ();
這裏的+、-是正負的意思,放在對象前面。
1 A& operator + (); 2 A& operator - (); 3 A* operator & (); 4 A& operator * ();
++和–根據位置的不一樣有四種狀況,均可以重載。
1 A& operator ++ ();//前置++ 2 A operator ++ (int);//後置++ 3 A& operator --();//前置-- 4 A operator -- (int);//後置--
按位操做。
1 A operator | (const A& ); 2 A operator & (const A& ); 3 A operator ^ (const A& ); 4 A operator << (int i); 5 A operator >> (int i); 6 A operator ~ ();
沒有=哦。
1 A& operator += (const A& ); 2 A& operator -= (const A& ); 3 A& operator *= (const A& ); 4 A& operator /= (const A& ); 5 A& operator %= (const A& ); 6 A& operator &= (const A& ); 7 A& operator |= (const A& ); 8 A& operator ^= (const A& ); 9 A& operator <<= (int i); 10 A& operator >>= (int i);
1 void *operator new(size_t size); 2 void *operator new(size_t size, int i); 3 void *operator new[](size_t size); 4 void operator delete(void*p); 5 void operator delete(void*p, int i, int j); 6 void operator delete [](void* p);
上面的運算符重載都有兩種方式,而下面的運算符只能用一種,特殊吧。 這些運算符的重載只能是成員函數。
1 A& operator = (const A& ); 2 char operator [] (int i);//返回值不能做爲左值 3 const char* operator () (); 4 T operator -> (); 5 //類型轉換符 6 operator char* () const; 7 operator int (); 8 operator const char () const; 9 operator short int () const; 10 operator long long () const; 11 //還有不少就不寫了
而這些只能以友元函數的形式重載
1 friend inline ostream &operator << (ostream&, A&);//輸出流 2 friend inline istream &operator >> (istream&, A&);//輸入流
兩種重載方式的比較:
注意事項: