C++運算符重載!!!

一般說來,單目運算符最好被重載爲成員;對雙目運算符最好被重載爲友元函數,雙目運算符重載爲友元函數比重載爲成員函數更方便.
    運算符重載實際是一個函數,所以運算符的重載實際上是函數的重載。編譯程序對運算符重載的選擇,遵循着函數重載的選擇原則。當遇到不很明顯的運算時,編譯程序將去尋找參數相匹配的運算符函數。
運算符重載的作用:
    運算符重載允許C/C++的運算符在用戶定義類型(類)上擁有一個用戶定義的意義。重載的運算符是函數調用的語法修飾:
  1.     class Fred 
  2.     Fred add(Fred, Fred); 
  3.     Fred operator+ (Fred, Fred); 

功能相同,只是衝在'+'使得功能更加的直觀.

可以用作重載的運算符:
算術運算符:+,-,*,/,%,++,--;
位操作運算符:&,|,~,^,<<,>>
邏輯運算符:!,&&,||;
比較運算符:<,>,>=,<=,==,!=;
賦值運算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;
其他運算符:[],(),->,,(逗號運算符),new,delete,new[],delete[],->*。
下列運算符不允許重載:
.,.*,::,?:

1. 重載爲類的成員函數

  1. class complex 
  2. complex operator +(const complex &c); 
  3. inline complex complex::operator +(const complex &c) 
  4.   return complex(real + c.real, imag + c.imag); 

程序中出現的表達式:
c1+c2
編譯程序將給解釋爲:
c1.operator+(c2)
其中,c1和c2是complex類的對象。operator+()是運算+的重載函數。

  重載爲成員函數時,不能再顯式說明參數。重載爲成員函數時,總時隱含了一個參數,該參數是this指針。this指針是指向調用該成員函數對象的指針。

2. 重載爲友元函數:
  運算符重載函數還可以爲友元函數。當重載友元函數時,將沒有隱含的參數this指針。這樣,對雙目運算符,友元函數有2個參數,對單目運算符,友元函數有一個參數。但是,有些運行符不能重載爲友元函數,它們是:=,(),[]和->。

  1. friend complex operator +(const complex &c1, const complex &c2); 
  2. complex operator +(const complex &c1, const complex &c2) 
  3. return complex(c1.real + c2.real, c1.imag + c2.imag); 
  4. }

該程序的運行結果與上例相同。前面已講過,對又目運算符,重載爲成員函數時,僅一個參數,另一個被隱含;重載爲友元函數時,有兩個參數,沒有隱含參數。因此,程序中出現的 c1+c2
編譯程序解釋爲:
operator+(c1, c2) 

3. 兩種重載形式的比較
一般說來,單目運算符最好被重載爲成員;對雙目運算符最好被重載爲友元函數,雙目運算符重載爲友元函數比重載爲成員函數更方便此,但是,有的雙目運算符還是重載爲成員函數爲好,例如,賦值運算符。因爲,它如果被重載爲友元函數,將會出現與賦值語義不一致的地方。

  1. counter operator ++(); 
  2. counter operator ++(int ); 
  3. counter counter::operator ++() 
  4. v++; 
  5. return *this
  6. counter counter::operator ++(int
  7. counter t; 
  8. t.v = v++; 
  9. return t; 

4. 重載函數調用運算符
可以將函數調用運算符()看成是下標運算[]的擴展。函數調用運算符可以帶0個至多個參數。下面通過一個實例來熟悉函數調用運算符的重載.

  1. class F 
  2. double operator ()(double x, double y) const
  3. }; 
  4. double F::operator ()(double x, double y) const 
  5. return (x+5)*y; 
  6. void main() 
  7. F f; 
  8. cout<<f(1.5, 2.2)<<endl; 

5.重載輸出運算符 <<
下面是一個棧類的輸出 cout<<st;爲輸出整個棧的元素

  1. friend ostream&  operator<<(ostream &os ,const CSTAC &st);
  2. ostream& operator<<(ostream &os ,const CSTAC &st)//CSTAC:: 
  3. {
  4.  if (st.count == 0)
  5.  {
  6.   os<<"the stack is empty!"<<endl;
  7.  }
  8.  for (int i=0; i<st.count; i++)
  9.  {
  10.   os<<st.p[i]<<" ";
  11.  }
  12.  os<<endl;
  13.  return os;
  14. }

OVER

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章