たとえば演算
X + Y
について考えます。XはクラスAのオブジェクトだとします。 この時X+を関数と考えて、Yを引数と思えばよいのです。 これをクラスAの定義部分に書けばよいことになります。 X+をfuncで置き換えるとfunc(Y)ということになります。 当然この関数には戻り値がありますからA func(Y)とか、 int func(Y)といった感じになります。
といった感じで使います。「+」演算子が 2重に定義されています。しかし、引数?の違いで 区別できるのは関数のオーバーロードと同じです。class A { public: //いろいろ・・・ void operator + (int i); void operator + (A Z); }; void A::operator + (int i) { //なんたらかんたら } void A::operator + (A Z) { //あーしろ、こーしろ }
さて、オペレータ・オーバーロードの例題ですが たいていの参考書では、複素数(complex)の演算の例を出しています。 すでにご存知と思いますが、複素数とは数学的な厳密さを抜きで いうと
a + bi
というやつです。ここで、a,bは実数、iは虚数単位といわれるものです。 iは2乗すると−1となります。 実際の計算は、文字の計算と同じでiの2乗が出てくる度に−1で 置き換えればよいのです。
そこで、今回はこの複素数を大幅に簡略化して 実数iはint型の整数しか取らない、演算は「+」しかない しかも、ここで出てくる実数は2つ加えてもint型の範囲に収まる といういい加減なものとします。
#include <iostream.h> class Comp { int real; //実数部分 int img; //虚数部分 public: Comp(int p, int q); Comp(); void show(); Comp operator + (Comp x); Comp operator + (int i); }; Comp::Comp(int p, int q) { real = p; img = q; } //引数なしでオブジェクトが生成された場合 //0としてしまう。 Comp::Comp(void) { real = 0; img = 0; } //Comp同士の加法の定義 Comp Comp::operator + (Comp x) { Comp z; z.real = real + x.real; z.img += img + x.img; return z; } //Comp + intの時の定義 Comp Comp::operator + (int i) { Comp z; z.real = real + i; z.img = img; return z; } void Comp::show(void) { cout << real << " + " << img << "i" << endl; return; } int main(void) { Comp A(3, 2), B(5, 6), C; cout << "A = "; A.show(); cout << "B = "; B.show(); cout << "A + B = "; C = A + B; C.show(); C = (A + B) + B; cout << "B + 10 = "; C = B + 10; C.show(); cout << "A + (-8) = "; C = A + (-8); C.show(); return 0; }
実行結果は、左の通りです。かけ算も定義してみてください。
実は、C++には複素数ライブラリというのがついています。
これに関しては、後の章で触れることにします。
Update Jan/19/1997 By Y.Kumei