程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#操作符重載

C#操作符重載

編輯:關於C語言

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);
  }
}

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved