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

C#銳利體驗(八)(3)

編輯:關於C語言

操作符重載

操作符是C#中用於定義類的實例對象間表達式操作的一種成員。和索引器類似,操作符仍然是對方法實現的一種邏輯界面抽象,也就是說在編譯成的IL中間語言代碼中,操作符仍然是以方法的形式調用的。在類內定義操作符成員又叫操作符重載。C#中的重載操作符共有三種:一元操作符,二元操作符和轉換操作符。並不是所有的操作符都可以重載,三種操作符都有相應的可重載操作符集,列於下表:

一元操作符 + - ! ~ ++ -- true false

二元操作符 + - * / % & | ^ << >> == != > < >= <=

轉換操作符 隱式轉換()和顯式轉換()

重載操作符必須是public和static 修飾的,否則會引起編譯錯誤,這在操作符的邏輯語義下是不言而喻的。父類的重載操作符會被子類繼承,但這種繼承沒有覆蓋,隱藏,抽象等行為,不能對重載操作符進行virtual sealed override abstract修飾。操作符的參數必須為傳值參數。我們下面來看一個具體的例子:

using System;
class Complex
{
    double r, v; //r+ v i
    public Complex(double r, double v)
    {
        this.r=r;
        this.v=v;
    }
    public static Complex Operator +(Complex a, Complex b)
    {
        return new Complex(a.r+b.r, a.v+b.v);
    }
    public static Complex Operator -(Complex a)
    {
        return new Complex(-a.r,-a.v);
    }
    public static Complex Operator ++(Complex a)
    {
        double r=a.r+1;
        double v=a.v+1;
        return new Complex(r, v);
    }
    public void Print()
    {
        Console.Write(r+" + "+v+"i");
    }
}
class Test
{
    public static void Main()
    {
        Complex a=new Complex(3,4);
        Complex b=new Complex(5,6);
        Complex c=-a;
        c.Print();
        Complex d=a+b;
        d.Print();
        a.Print();
        Complex e=a++;
        a.Print();
        e.Print();
        Complex f=++a;
        a.Print();
        f.Print();
    }
}

編譯程序並運行可得到下面的輸出:

-3 + -4i 8 + 10i 3 + 4i 4 + 5i 3 + 4i 5 + 6i 5 + 6i

我們這裡實現了一個“+”號二元操作符,一個“-”號一元操作符(取負值),和一個“++”一元操作符。注意這裡,我們都沒有對傳進來的參數作任何改變--這在參數是引用類型的變量是尤其重要,雖然重載操作符的參數只能是傳值方式。而我們在返回值時,往往需要“new”一個新的變量--除了true和false操作符。這在重載“++”和“--” 操作符時尤其顯得重要。也就是說我們做在a++時,我們將丟棄原來的a值,而取代的是新的new出來的值給a! 值得注意的是e=a++或f=++a中e的值或f的值根本與我們重載的操作符返回值沒有一點聯系!它們的值僅僅是在前置和後置的情況下獲得a的舊值或新值而已!前置和後置的行為不難理解。

操作符重載對返回值和參數類型有著相當嚴格的要求。一元操作符中只有一個參數。操作符“++”和“--”返回值類型和參數類型必須和聲明該操作符的類型一樣。操作符“+ - ! ~”的參數類型必須和聲明該操作符的類型一樣,返回值類型可以任意。true和false操作符的參數類型必須和聲明該操作符的類型一樣,而返回值類型必須為bool,而且必須配對出現--也就是說只聲明其中一個是不對的,會引起編譯錯誤。參數類型的不同會導致同名的操作符的重載--實際上這是方法重載的表現。

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