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

課題1では,関数のオーバーロードを学びました.関数のオーバーロードとは,異なる関数に同じ名前を与えることでした.

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

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

練習課題

main.cpp

(ヒント)下記のプログラムは,二つのint型変数を持つクラスにおける演算子=と演算子+のオーバーロード例である. ダウンロード,ビルド,実行し,このプログラムを参考にMyStringを完成させよ.

coord.cpp

解説1: 演算子オーバーロードについて

説明スライド

解説2: その他のポイント

解説3: 関係演算子,論理演算子のオーバーロード

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

解説4: 単項演算子のオーバーロード

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

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: 添え字演算子のオーバーロード

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

オプション課題

次の演算子もオーバーロードしなさい.ただし,MyStringクラスオブジェクトを対象とすること.