利用者定義演算子とは
利用者定義演算子とは、
プログラミング言語において、言語の利用者が既存の演算子に対して、組み込みの演算子とは異なる独自の動作を定義できる機能です。この機能により、プログラマは演算子を特定のデータ型やオブジェクトに合わせてカスタマイズし、より直感的で読みやすいコードを書くことが可能になります。
歴史と発展
この機能は、古くはFORTRANから導入されました。当初は、コードの
可読性と記述性を向上させる目的で様々な
プログラミング言語に取り入れられましたが、Smalltalkや
C++といった
オブジェクト指向言語の発達とともに、多態性を実現するための重要な機能としての側面も持つようになりました。
定義方法
利用者定義演算子の定義方法は、
プログラミング言語によって異なりますが、一般的には関数、メンバー関数、またはメソッドのいずれかを用いて定義されます。
Smalltalkでの例
Smalltalkでは、メソッドに記号のみで構成されるセレクター(メソッド名)を使用することで、利用者定義演算子を定義できます。Smalltalkでは、演算子を「2項セレクター」と呼び、`#with:`のように英数字で構成されるセレクターとほぼ同様に扱います。
Smalltalkにおける演算子はメッセージの一種であり、引数が必ず1つで優先順位が異なる点を除いては特別扱いされません。そのため、演算子として定義できる記号にはほとんど制限がありません(ただし、区切り記号や代入記号は指定できません)。また、演算子として定義する記号は`->`や`~=`のように2文字でも構いません。Smalltalkでは
多重定義ができないため、同じクラス内で同じ演算子を複数定義することはできません。ただし、インスタンスオブジェクトとクラスオブジェクトは同じクラスに紐づくものの別のオブジェクトであるため、インスタンスメソッドとクラスメソッドで同じ演算子を定義することは可能です。
C++での例
C++では、`operator`キーワードの後に記号をつけた形の特殊な名前を持つ関数を定義することで、演算子を定義できます。
C++では言語機能として用意されている演算子しか定義できず、独自の記号を用いた演算子を定義することはできません。また、演算子の引数や戻り値の型は演算子の種類によって制限されます。例えば、型のメンバーを指定する`->`演算子を単項演算子として独自に定義したり、数値型や`->`演算子を定義していない型を戻り値の型として指定することはできません。
C++には
多重定義の機能があるため、利用者定義演算子は
多重定義の枠組みに入っています。このためSmalltalkとは異なり、引数が異なる場合に限り、同じ名前空間で同じ名前の演算子を複数定義できます。ただし、既存の演算子を上書きすることになるため、数値型だけを引数とする演算子の定義はできません。
利用可能な言語
利用者定義演算子をサポートする言語としては、以下のようなものがあります。
FORTRAN
Smalltalk
C++
その他、いくつかの
オブジェクト指向言語
オブジェクト指向言語では、利用者定義演算子は、FORTRANと同様に
可読性と記述性の向上に貢献するだけでなく、数値型とオブジェクトを同じように扱えるようにするための重要な機能となっています。特に、純粋な
オブジェクト指向言語であるSmalltalkでは、オブジェクトに対する操作はすべてメソッドとして表されるべきであり、演算子も単なるメソッドの一種として位置づけられています。
多態性の実現例
利用者定義演算子は、多態性を実現するための強力なツールとしても活用されます。以下にSmalltalkと
C++での多態性の例を示します。
Smalltalkの例
(具体的なコード例は、元のテキストに具体的なコードがないため割愛します)
Smalltalkでは、異なるクラスのオブジェクトに対して同じ演算子を適用すると、それぞれのクラスで定義された異なる動作が実行されます。
C++の例
(具体的なコード例は、元のテキストに具体的なコードがないため割愛します)
C++では、派生クラスで基底クラスの演算子をオーバーライドすることで、多態性を実現できます。
まとめ
利用者定義演算子は、
プログラミング言語の表現力を高め、より柔軟で直感的なコード記述を可能にする重要な機能です。特に
オブジェクト指向プログラミングにおいては、多態性を実現するための重要な役割を果たします。この機能により、プログラマは特定のデータ型やオブジェクトの振る舞いをカスタマイズし、より効率的で保守性の高いコードを作成できます。
関連項目
*
多重定義