C++運算子多載!!!

來源:互聯網
上載者:User
一般說來,單目運算子最好被重載為成員;對雙目運算子最好被重載為友元函數,雙目運算子多載為友元函數比重載為成員函數更方便.
    運算子多載實際是一個函數,所以運算子的重載實際上是函數的重載。編譯器對運算子多載的選擇,遵循著函數重載的選擇原則。當遇到不很明顯的運算時,編譯器將去尋找參數相匹配的運算子函數。
運算子多載的作用:
    運算子多載允許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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.