「クラス関連」

演算子のオーバーロード(多重定義)

C++のプログラムは、独自の型の組み込み演算子のふるまいを指定できる。例えば
Complexクラスでは、算術演算子の動作を定義できる。加算の場合、+演算子
を次のよおうに宣言できる。



 ここでfriendというキーワードは、このOperator+が、ComplexのPrivateなデータにアクセス
できる、独立した関数だという意味を持つ。2項演算子では、これかが典型的なシグネチャーだ。
\  このように+演算子をオーバーロード(overload : 多重定義)しておけば、2つの複素数オブジェクト
を次のように加算できる。



 また、2項の比較演算子も同じようにオーバーロードできる。ただし、この場合の演算子が
boolを返す。例えば次のコードは、==演算子をオーバーロードする。



 さらに、代入演算子、すなわち=演算子もオーバーロードできる。コピーコンストラクター
の場合に似て、もし代入演算子を指定しなければ、C++は浅いコピーを行うデフォルトの代入
演算子を利用する。だから「3つの法則」に該当する通常のケースでは、少なくとも代入演算子
をオーバーロードする必要がある。
 代入演算子とコピーコンストラクターには、1つ大きな違いがある。コピーコンストラクターは、
既存のオブジェクトのコピーとして、新しいオブジェクトを構築する。代入演算子
は、オブジェクトのすでに存在するインスタンスを上書きする。例えば次のコードは、3行目で
DynamicArrayの代入演算子を呼び出すが、それはa1
1行目ですでに構築されいるからだ。



 代入演算子は、すでに存在するインスタンスを新しい値で上書きするのだから、それまでに動的に割り当てられた
データがあれば、割り当てを解除する必要がある。例えば次の例は、
DynamicArrayの代入演算子として正しい実装である。



 代入演算子、独立したfriend関数ではなく、クラスのメンバー関数であることに注意しましょう。
、また、規則により代入演算子は代入されたオブジェクトへの参照を返す。これによって
次のように代入の連鎖を書くことができる。



C++では、ほとんどあらゆる演算子をオーバーロードできる。それには添え字演算子の[]や、
newや、deleteも含まれる。ただし、大いなる力には、大いなる責任を伴う。
演算子のオーバーロードは、その演算子が何かを行うかが明らかな時にだけ行うべきだ。+演算子が加算を行うこと
は明白だが、演算子の意味を変えてしまうのは避けなければいけない。

【戻る】