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

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

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

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

課題

課題3−1

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

解説

(1)ポイント

(2)2項演算子のオーバーロード(p.179〜)

冗長だが、thisを使って以下のようにも書ける。

coord coord::operator+(coord ob2)
{
    coord temp;
    temp.x = this->x + ob2.x;
    temp.y = this->y + ob2.y;
    return temp;
}

thisはキーワードであるため、変数名等には使えないので注意すること

このほかのポイント

課題3−2

ここまでの補足説明スライド

解説のつづき

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

// 関係演算子 == のオーバーロード
bool coord::operator==(coord ob2)
{
    return x == ob2.x && y == ob2.y;
}

// 論理演算子 && のオーバーロード
bool coord::operator&&(coord ob2)
{
    return (x && ob2.x) && (y && ob2.y);
}

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

// 単項演算子 - (負符号)のオーバーロード
// 仮引数は不要

coord coord::operator-()
{
    x = -x;
    y = -y;
    return *this;
}

// ++演算子(前置形式)のオーバーロード
coord coord::operator++()
{
    x++;
    y++;
    return *this;
}

// ++演算子(後置形式)のオーバーロード
// (2008.6.6 変更前の値を返すように修正)

coord coord::operator++(int notused)
{
    coord tmp = *this;
    x++;
    y++;
    return tmp;
}

(5)添え字演算子のオーバーロード(p.200)

const int SIZE = 10;
 
class arraytype {
   double a[SIZE];
public:
...
};
 
// [ ] 演算子のオーバーロード
// 「代入」もできるように「参照」を返す

double &arraytype::operator[](int i)
{
   if (i < 0 || i >= SIZE) {
     cerr << "エラー!範囲外です。";
     cerr << "添字 i = " << i << endl;
     exit(1);
   }
 
   return a[i];  
}

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

課題3−3

  1. coordクラスに上記二つのフレンド演算子を追加して実装し、コンパイル、実行してみなさい。