演算子のオーバーロードをやってみる

はいどーもみなさんこんにちは。
自分をプログラマだと思いこんでいるニートです。
「そういや演算子のオーバーロードって一回もやったことねえなあ」とふと思ったので、本日は演算子のオーバーロードのお勉強をしてみたいと思います。

演算子のオーバーロードとは

演算子のオーバーロードとは、自作したクラスに対して演算子の意味を定義することです。
例えばSampleという自作クラスがあったとします。
通常の場合ですと、このSampleクラスのインスタンスsample1とsample2に対して演算子を適用することはできません。
例えばsample1 + sample2のような感じですね。
これを可能にしちゃおう、というのが演算子のオーバーロードです。

やってみる

さっそくやってみましょう。
と言っても難しいこたーありません。

まずはクラスOperatorOverloadingを作成します。

見ての通り、プロパティXとYを持つだけのクラスです。
このクラスに+演算子と++演算子をオーバーロードしてみましょう。

はいこんな感じです。
「OperatorOverloading型のインスタンスに対して+演算子を適用した場合、各インスタンスのXとYを足して、新しいOperatorOverloading型のインスタンスを返す」という意味を定義しました。
++演算子も似たような感じですね。

構文はまんま覚えるか、忘れたらググればいいんじゃないでしょうかw
普通のメソッドと違うのは、staticであることと、operatorキーワードのあとに対象の演算子を指定することくらいでしょう。
引数にはオペランドを指定します。
二項演算子ならば、片方のオペランドはオーバーロードするクラスの型と必ず同じでなければなりません。
もう片方は自由です。
今回は両方とも自分の型にしました(OperatorOverloading)。
また、当たり前ですが単項演算子の場合、引数には必ず自分と同じ型のオペランドを指定しなければなりません。

まあ理屈がわかってれば、この辺の細かい制限は覚える必要はないんじゃないかなーと思います。
staticをつけるのと、operatorキーワード、そして引数にオペランドを指定することだけ心に留めておきましょう。
あ、戻り値の型も自由です(今回はOperatorOverloading)。

使ってみる

Mainメソッド内をこんな感じにしてください(コンソールアプリケーション)。

ご覧の通り、sample1とsample2に+演算子を使用することができていますね。
また、単項演算子である++演算子も使用できています。
はいめでたしめでたし。

今回は+演算子と++演算子しかオーバーロードしていませんが、当然他の演算子もオーバーロードできます。
ついでに言うと、関係演算子(trueかfalse返すやつ)もオーバーロード可能なようです。

終わりに

演算子のオーバーロードをオーバーロードすることも可能なようですね。
つまり、今回の場合ですと+演算子の引数にはOperatorOverloading型しか指定していませんが、OperatorOverloading型とint型を指定したものを別に作成する、ということができるわけです。
ウーン、便利ですね。
実際、Unityの組み込みオブジェクトによく使われている気がします。

ただ自分のクラスに使うとき、どんな感じにすればいいかなと悩みますねw
ほなそんな感じでまた。

フォローする