初級編では、関数のオーバーロードを学びました。関数のオーバーロードとは、異なる関数に同じ名前を与えることでした。例として、intの絶対値を返す関数、longの絶対値を返す関数がともに「abs」という名前で定義されているサンプルリストがあげられていましたね。(List2-5)
ここでは、演算子のオーバーロードについて説明します。
これまでは、int型 + int型 のように組込み型のものどうしの演算しか行っていませんでしたが、演算子をオーバーロードすると 自分で作ったクラスのオブジェクト + 自分で作ったクラスのオブジェクトのように、演算子に新しい意味を追加できます。
冗長だが、thisを使って以下のようにも書ける。
coord coord::operator+(coord ob2)
{
coord temp;
temp.x = this->x + ob2.x;
temp.y = this->y + ob2.y;
return temp;
}
|
※thisはキーワードであるため、変数名等には使えないので注意すること
このほかのポイント
// 関係演算子 == のオーバーロード int coord::operator==(coord ob2)
{
return x == ob2.x && y == ob2.y;
}
// 論理演算子 && のオーバーロード int coord::operator&&(coord ob2)
{
return (x && ob2.x) && (y && ob2.y);
}
|
// 単項演算子 - (負符号)のオーバーロード // 仮引数は不要 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;
}
|
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];
}
|