C#操作符重載

來源:互聯網
上載者:User

11.5.1 問題的提出

在物件導向的程式設計中,自己定義一個類,就等於建立了一個新類型。類的執行個體和變數一樣,可以作為參數傳遞,也可以作為傳回型別。

在第七章中,我們介紹了系統定義的許多操作符。比如對於兩個整型變數,使用算術操作符可以簡便地進行算術運算:

class A{ public int x; public int y; public int Plus{    return x+y;  }}再比如,我們希望將屬於不同類的兩個執行個體的資料內容相加:class B{  public int x;}class Test{ public int z; public static void Main{    A a=new A();    B b=new B();    z=a.x+b.x; }}

使用a.x+b.x這種寫法不夠簡潔,也不夠直觀。更為嚴重的問題是,如果類的成員中聲明時使用的不是publixc修飾符的話,這種訪問就是非法的。

我們知道,在C#中,所有資料要麼屬於某個類,要麼屬於某個類的執行個體,充分體現了物件導向的思想。因此,為了表達上的方便,人們希望可以重新給已定義的操作符賦予新的含義,在特定的類的執行個體上進行新的解釋。這就需要通過操作符重載來解決。

11.5.2 使用成員方法重載操作符

C#中,操作符重載總是在類中進行聲明,並且通過調用類的成員方法來實現。

操作符重載聲明的格式為:

type operator operator-name(formal-param-list)

C#中,下列操作符都是可以重載的:

+ - ! ~ ++ -- true false

* / % & | ^ << >> == != > < >= <=

但也有一些操作符是不允許進行重載的,如:

=,&&,||,?:,new,typeof,sizeof,is

一元操作符重載

顧名思義,一元操作符重載時操作符只作用於一個對象,此時參數表為空白,當前對象作為操作符的單運算元。

下面我們舉一個角色遊戲中經常遇到的例子。扮演的角色具有內力、體力、經驗值、剩餘體力、剩餘內力五個屬性,每當經驗值達到一定程式時,角色便會升級,體力、內力上升,剩餘體力和內力補滿。“升級”我們使用重載操作符“++”來實現。

程式清單11-10:

using System;class Player{ public int neili; public int tili; public int jingyan; public int neili_r; public int tili_r; public Player() {   neili=10;   tili=50;   jingyan=0;   neli_r=50;   tili_r=50; } public static Player operator ++(Player p){   p.neili=p.neili+50;   p.tili=p.tili+100;   p.neili_r=p.neili;   p.tili_r=p.tili;   return p; } public void Show() {  Console.WriteLine("Tili:{0}",tili);  Console.WriteLine("Neili:{0}",neili);  Console.WriteLine("Tili_full:{0}",tili_r);  Console.WriteLine("Neili_full:{0}",neili_r); }}class Test{ public static void Main(){    Player man=new Player();    man.Show();    man++;    Console.WriteLine("Now upgrading...:");    man.Show(); }}

二元操作符重載

大多數情況下我們使用二元操作符重載。這時參數表中有一個參數,當前對象作為該操作符的左運算元,參數作為操作符的右運算元。

下面我們給出二元操作符重載的一個簡單例子,即笛卡兒座標相加。

程式清單11-11:

using System;class DKR{  public int x,y,z;  public DKR(int vx,int vy,int vz){     x=vx;     y=vy;     z=vz;  }  public static DKR operator +(DKR d1,DKR d2)  {  DKR dkr=new DKR(0,0,0);  dkr.x=d1.x+d2.x;  dkr.y=d1.y+d2.y;  dkr.z=d1.z+d2.z;  return dkr;  }}class Test{  publixc statixc void Main(){    DKR d1=new DKR(3,2,1);    DKR d2=new DKR(0,6,5);    DKR d3=d1+d2;    Console.WriteLine("The 3d location of d3 is:{0},{1},{2}",d3.x,d3.y,d3,z);  }}

試著編譯、運行該程式,看結果是否與預期一致。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.