首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 銳利體驗 (八) (3):運算子多載完整指南

     編輯:關於C語言

運算子多載

運算子為 C# 定義類別實例間運算式操作的成員。類似索引器,運算子仍為方法實現的邏輯介面抽象,編譯為 IL 時仍以方法形式呼叫。類別內定義運算子成員稱「運算子多載」。C# 可多載運算子三類:

類別可多載運算子
一元運算子+ - ! ~ ++ -- true false
二元運算子+ - * / % & | ^ << >> == != > < >= <=
轉換運算子隱式轉換 implicit、顯式轉換 explicit

規則限制

  • 必須為 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)
    { return new Complex(a.r + 1, a.v + 1); }
    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();        // -3 + -4i
        Complex d = a + b; d.Print();     // 8 + 10i
        a.Print();                        // 3 + 4i
        Complex e = a++; a.Print(); e.Print(); // 4 + 5i / 3 + 4i
        Complex f = ++a; a.Print(); f.Print(); // 5 + 6i / 5 + 6i
    }
}

輸出:-3 + -4i 8 + 10i 3 + 4i 4 + 5i 3 + 4i 5 + 6i 5 + 6i

關鍵細節

  • 實現 + 二元運算子、- 一元運算子(取負)、++ 一元運算子。
  • 不修改傳入參數(參考型別參數特別重要),雖參數只能傳值。
  • 回傳值常需 new 新物件(true/false 運算子除外)。++/-- 特別重要:a++ 時捨棄原 a,以新 new 物件取代!
  • e = a++ 或 f = ++a 中 e/f 值與多載運算子回傳值無關!僅為前置/後置情況下取得 a 舊值或新值。

運算子多載型別嚴格要求

  • 一元運算子單一參數。
  • ++/-- 回傳型別與參數型別必須同聲明類別。
  • + - ! ~ 參數型別必須同聲明類別,回傳型別可任意。
  • true/false 參數型別必須同聲明類別,回傳型別必為 bool,且必須成對出現(單獨宣告編譯錯誤)。
  • 參數型別不同可構成同名運算子多載(本質為方法多載)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved