演算子のオーバーロード (演算子の多重定義)(教科書p.183〜212)

初級編では、関数のオーバーロードを学びました。関数のオーバーロードとは、異なる関数に同じ名前を与えることでした。例として、intの絶対値を返す関数、longの絶対値を返す関数がともに「abs」という名前で定義されているサンプルリストがあげられていましたね。(List2-5)

ここでは、演算子のオーバーロードについて説明します。

これまでは、int型 + int型 のように組込み型のものどうしの演算しか行っていませんでしたが、演算子をオーバーロードすると 自分で作ったクラスのオブジェクト + 自分で作ったクラスのオブジェクトのように、演算子に新しい意味を追加できます。

練習課題3

  1. 教科書p.185-186のサンプルプログラム(例6.2-1)を入力し、コンパイル、実行してみなさい。 (プロジェクト名はp3kadai2w3とする。ソースファイル1つでよい。)

解説

(1)ポイント

(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;
}

このほかのポイント

練習課題3の追加課題

  • 教科書p.185-186のサンプルプログラム(例6.2-1)を変更し,演算子 * と 演算子 / をcoordに対してオーバーロードしなさい.(教科書p.192 練習問題6.2-1) 

解説のつづき

先週の補足説明スライド

(3)関係演算子、論理演算子のオーバーロード(p.193)

  • int型を返している点に注目。
  • 真ならば非0偽ならば0を返すようにつくる。

(4)単項演算子のオーバーロード(p.194)

  • オペランドが1つしかないので仮引数は必要ない。
  • ただし、新しいC++で、後置のインクリメント/デクリメントを宣言する際には、int notusedを使う。(p.195例6.4-2)

(5)フレンド演算子関数の使用(p.197)

  • フレンド関数は、メンバ関数ではないので、thisポインタを持たない。このため、
    • 左のオペランドが暗黙のうちに渡されることはない。
    • 代入演算子のオーバーロードにはフレンドを使用できない。
  • オペランドを明示的に引数として渡す必要がある。
  • 左のオペランド組み込み型にできるようになる。(メンバ演算子関数にない利点)