C# は演算子のオーバーロードをサポートしています。いわゆる演算子のオーバーロードとは、カスタム型を使用して C# のほとんどの演算子の機能を再定義できることを意味します。演算子のオーバーロードは、演算子キーワードの後に演算子を続けることで定義する必要があります。再定義された演算子は、特別な名前を持つ関数とみなすことができます。他の関数と同様に、この関数にも、次のような戻り値の型とパラメータ リストがあります。 :
public static Box operator+ (Box b, Box c) {
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
上記の関数は、加算演算子+
のオーバーロードを実装します。これは 2 つの Box オブジェクトのプロパティを必要とし、Box オブジェクトを返します。
コンテンツ
表示
演算子のオーバーロードの実装
演算子のオーバーロードを示す完全な例を次に示します。
using System;
namespace it-kiso.com
{
class Box
{
private double length; // 長さ
private double breadth; // 幅
private double height; // 高さ
public double getVolume()
{
return length * breadth * height;
}
public void setLength( double len )
{
length = len;
}
public void setBreadth( double bre )
{
breadth = bre;
}
public void setHeight( double hei )
{
height = hei;
}
// 重載 + 演算子、2つの Box オブジェクトを足し合わせる
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
}
class Demo
{
static void Main(string[] args)
{
Box Box1 = new Box(); // Box1を宣言、型は Box
Box Box2 = new Box(); // Box2を宣言、型は Box
Box Box3 = new Box(); // Box3を宣言、型は Box
double volume = 0.0; // 体積
// Box1の詳細を設定
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// Box2の詳細を設定
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// Box1の体積
volume = Box1.getVolume();
Console.WriteLine("Box1の体積: {0}", volume);
// Box2の体積
volume = Box2.getVolume();
Console.WriteLine("Box2の体積: {0}", volume);
// 2つのオブジェクトを足し合わせる
Box3 = Box1 + Box2;
// Box3の体積
volume = Box3.getVolume();
Console.WriteLine("Box3の体積: {0}", volume);
Console.ReadKey();
}
}
}
操作の結果は次のようになります。
Box1の体積
: 210
Box2の体積
: 1560
Box3の体積
: 5400
オーバーロード可能な演算子とオーバーロード不可能な演算子
次の表に、C# 演算子のオーバーロード可能性に関する情報を示します。
オペレーター | リロード可能性 |
---|---|
+、-、!、~、++、– | これらの単項演算子はオーバーロードできる |
+、-、*、/、%、&、|、^、<<、>>、=、!=、<、>、<=、>= | これらの二項演算子はオーバーロードできます。一部の演算子はペアでオーバーロードする必要があることに注意してください。 |
&&、|| | 論理演算子をオーバーロードできません |
(type)var_name | キャスト演算子はオーバーロードできません |
+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>= | 複合代入演算子は明示的にオーバーロードできません。ただし、二項演算子をオーバーロードすると、対応する複合代入演算子も暗黙的にオーバーロードされます。たとえば、 + 演算子も+= で暗黙的にオーバーロードされます。 |
^、=、.、?.、? : 、??、??=、..、->、=>、as、await、checked、unchecked、default、delegate、is、nameof、new、sizeof、stackalloc、switch、typeof | これらの演算子はオーバーロードできません |
注: 比較演算子はペアでオーバーロードする必要があります。つまり、ペアのいずれかの演算子がオーバーロードされた場合、もう一方の演算子もオーバーロードする必要があります。たとえば==
演算子と!=
演算子、 <
演算子と>
演算子、 <=
演算子と>=
演算子などです。
【例】具体的な例で説明しましょう。
using System;
namespace it-kiso.com
{
class Box
{
private double length; // 長さ
private double breadth; // 幅
private double height; // 高さ
public double getVolume()
{
return length * breadth * height;
}
public void setLength( double len )
{
length = len;
}
public void setBreadth( double bre )
{
breadth = bre;
}
public void setHeight( double hei )
{
height = hei;
}
// 重載 + 演算子で二つの Box オブジェクトを足し算する
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
public static bool operator== (Box lhs, Box rhs)
{
bool status = false;
if (lhs.length == rhs.length && lhs.height == rhs.height && lhs.breadth == rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator!= (Box lhs, Box rhs)
{
bool status = false;
if (lhs.length != rhs.length || lhs.height != rhs.height || lhs.breadth != rhs.breadth)
{
status = true;
}
return status;
}
public override bool Equals(object o)
{
if(o==null) return false;
if(GetType() != o.GetType()) return false;
return true;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public static bool operator <(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length < rhs.length && lhs.height < rhs.height && lhs.breadth < rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator >(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length > rhs.length && lhs.height > rhs.height && lhs.breadth > rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator <=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length <= rhs.length && lhs.height <= rhs.height && lhs.breadth <= rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator >=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length >= rhs.length && lhs.height >= rhs.height && lhs.breadth >= rhs.breadth)
{
status = true;
}
return status;
}
public override string ToString()
{
return String.Format("({0}, {1}, {2})", length, breadth, height);
}
}
class Demo
{
static void Main(string[] args)
{
Box Box1 = new Box(); // Box1 を宣言し、型は Box
Box Box2 = new Box(); // Box2 を宣言し、型は Box
Box Box3 = new Box(); // Box3 を宣言し、型は Box
Box Box4 = new Box();
double volume = 0.0; // 体積
// Box1 の詳細
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// Box2 の詳細
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// 重載された ToString() を使用して二つの Box を表示
Console.WriteLine("Box1: {0}", Box1.ToString());
Console.WriteLine("Box2: {0}", Box2.ToString());
// Box1 の体積
volume = Box1.getVolume();
Console.WriteLine("Box1 の体積: {0}", volume);
// Box2 の体積
volume = Box2.getVolume();
Console.WriteLine("Box2 の体積: {0}", volume);
// 二つのオブジェクトを足し算
Box3 = Box1 + Box2;
Console.WriteLine("Box3: {0}", Box3.ToString());
// Box3 の体積
volume = Box3.getVolume();
Console.WriteLine("Box3 の体積: {0}", volume);
// Box の比較
if (Box1 > Box2)
Console.WriteLine("Box1 は Box2 より大きい");
else
Console.WriteLine("Box1 は Box2 より大きくない");
if (Box1 < Box2)
Console.WriteLine("Box1 は Box2 より小さい");
else
Console.WriteLine("Box1 は Box2 より小さくない");
if (Box1 >= Box2)
Console.WriteLine("Box1 は Box2 以上");
else
Console.WriteLine("Box1 は Box2 以上ではない");
if (Box1 <= Box2)
Console.WriteLine("Box1 は Box2 以下");
else
Console.WriteLine("Box1 は Box2 以下ではない");
if (Box1 != Box2)
Console.WriteLine("Box1 と Box2 は等しくない");
else
Console.WriteLine("Box1 と Box2 は等しい");
Box4 = Box3;
if (Box3 == Box4)
Console.WriteLine("Box3 と Box4 は等しい");
else
Console.WriteLine("Box3 と Box4 は等しくない");
Console.ReadKey();
}
}
}
「 C# 演算子のオーバーロード」についてわかりやすく解説!絶対に観るべきベスト2動画
演算子のオーバーロード [C++ライブ]
C++ 10.演算子のオーバーロード