演算子のオーバーロード (C# と Java の比較)

更新 : 2007 年 11 月

C# では、C++ と同様に、ユーザー定義クラス専用の演算子をオーバーロードできます。これにより、ユーザー定義データ型が基本データ型と同じように違和感なく、論理的に使用できるようになります。たとえば、複素数を表す ComplexNumber という新しいデータ型を作成した場合には、標準の算術演算子を使用して複素数に対する数値演算 (+ 演算子を使用して 2 つの複素数を加算するなど) を実行するメソッドを提供できます。

演算子をオーバーロードするには、名前演算子の後にオーバーロード対象の演算子の記号が続く関数を作成します。たとえば、+ 演算子をオーバーロードする場合は、次のようなコードを記述します。

public static ComplexNumber operator+(ComplexNumber a, ComplexNumber b)

すべての演算子のオーバーロードはクラスの静的なメソッドです。また、等値演算子 (==) をオーバーロードする場合は、非等値演算子 (!=) もオーバーロードする必要があります。< と >、および <= と >= の演算子も、ペアでオーバーロードする必要があります。

オーバーロードが可能な演算子の一覧を以下に示します。

  • 単項演算子 : +、-、!、~、++、--、true、false

  • 二項演算子 : +、-、*、/、%、&、|、^、<<、>>、==、!=、>、<、>=、<=

+ 演算子と - 演算子をオーバーロードする ComplexNumber クラスを作成するコード例を次に示します。

public class ComplexNumber
{
    private int real;
    private int imaginary;

    public ComplexNumber() : this(0, 0)  // constructor
    {
    }

    public ComplexNumber(int r, int i)  // constructor
    {
        real = r;
        imaginary = i;
    }

    // Override ToString() to display a complex number in the traditional format:
    public override string ToString()
    {
        return(System.String.Format("{0} + {1}i", real, imaginary));
    }

    // Overloading '+' operator:
    public static ComplexNumber operator+(ComplexNumber a, ComplexNumber b)
    {
        return new ComplexNumber(a.real + b.real, a.imaginary + b.imaginary);
    }

    // Overloading '-' operator:
    public static ComplexNumber operator-(ComplexNumber a, ComplexNumber b)
    {
        return new ComplexNumber(a.real - b.real, a.imaginary - b.imaginary);
    }
}

このクラスでは、次のようなコードを使用して 2 つの複素数を作成し、操作できます。

class TestComplexNumber
{
    static void Main()
    {
        ComplexNumber a = new ComplexNumber(10, 12);
        ComplexNumber b = new ComplexNumber(8, 9);

        System.Console.WriteLine("Complex Number a = {0}", a.ToString());
        System.Console.WriteLine("Complex Number b = {0}", b.ToString());

        ComplexNumber sum = a + b;
        System.Console.WriteLine("Complex Number sum = {0}", sum.ToString());

        ComplexNumber difference = a - b;
        System.Console.WriteLine("Complex Number difference = {0}", difference.ToString());
    }
}

上のプログラムが示すように、ComplexNumber クラスに属するオブジェクトには、プラス演算子とマイナス演算子を直観的に使用できます。このプログラムの出力を次に示します。

Complex Number a = 10 + 12i

Complex Number b = 8 + 9i

Complex Number sum = 18 + 21i

Complex Number difference = 2 + 3i

Java は演算子のオーバーロードをサポートしませんが、文字列連結の際には、内部で + 演算子をオーバーロードします。

参照

処理手順

演算子のオーバーロードのサンプル

概念

C# プログラミング ガイド

参照

オーバーロードされた演算子 (C# プログラミング ガイド)

その他の技術情報

Java 開発者のための C# プログラミング言語