演算子のオーバーロード (演算子の多重定義)(教科書p.183〜212)
初級編では、関数のオーバーロードを学びました。関数のオーバーロードとは、異なる関数に同じ名前を与えることでした。例として、intの絶対値を返す関数、longの絶対値を返す関数がともに「abs」という名前で定義されているサンプルリストがあげられていましたね。(List2-5)
ここでは、演算子のオーバーロードについて説明します。
これまでは、int型 + int型 のように組込み型のものどうしの演算しか行っていませんでしたが、演算子をオーバーロードすると 自分で作ったクラスのオブジェクト + 自分で作ったクラスのオブジェクトのように、演算子に新しい意味を追加できます。
練習課題3
- 教科書p.185-186のサンプルプログラム(例6.2-1)を入力し、コンパイル、実行してみなさい。
(プロジェクト名はp3kadai2w3とする。ソースファイル1つでよい。)
解説
(1)ポイント
- 関数のオーバーロードに似ているが、規則がいくつか加わる。
- 何らかの型(クラス)に関連付けて定義する。
- 演算子の優先順位は変更できない。(演算子の優先順位は演習1課題1の3.6節を読み直して思い出そう。)
- 演算子が受け取るオペランドの数は変更できない。(例えば、2項演算子 + の場合、オペランドは2つ。)
- オーバーロードできない演算子は、 .(ドット演算子)、 :: (スコープ解決演算子)、 .* 、 ? (3項演算子) の4つ、および、プリプロセッサ演算子。
- すでにある演算子に新しい意味を追加できるということ。ユーザ独自の新しい演算子が作れるわけではない。
(2)2項演算子のオーバーロード(p.185〜)





冗長だが、以下のようにも書ける。
coord coord::operator+(coord ob2)
{
coord temp;
temp.x = this->x + ob2.x;
temp.y = this->y + ob2.y;
return temp;
}
|
このほかのポイント
- 左のオペランドは演算子の定義対象になっているクラスのオブジェクトにしかできない。(暗黙のうちに渡されるため。)
- *thisを返すように作ると、左のオペランドが演算によって変更される。(p.188代入演算子 = 例6.2-2)
- 右のオペランドはint型やdouble型など組み込み型のオブジェクトにすることもできる。(pp.189-190例6.2-3)
- 参照仮引数を使用することもできる。(p.191例6.2-4)
練習課題3の追加課題
- 教科書p.185-186のサンプルプログラム(例6.2-1)を変更し,演算子 * と 演算子 / をcoordに対してオーバーロードしなさい.(教科書p.192 練習問題6.2-1)
(3)関係演算子、論理演算子のオーバーロード(p.193)
- int型を返している点に注目。
- 真ならば非0、偽ならば0を返すようにつくる。
- オペランドが1つしかないので仮引数は必要ない。
- ただし、新しいC++で、後置のインクリメント/デクリメントを宣言する際には、int notusedを使う。(p.195例6.4-2)
(5)フレンド演算子関数の使用(p.197)
- フレンド関数は、メンバ関数ではないので、thisポインタを持たない。このため、
- 左のオペランドが暗黙のうちに渡されることはない。
- 代入演算子のオーバーロードにはフレンドを使用できない。
- オペランドを明示的に引数として渡す必要がある。
- 左のオペランドを組み込み型にできるようになる。(メンバ演算子関数にない利点)

