第16章 オペレータ・オーバーロード


オペレータ(operator)とは、「+,−,*,....」 のことです。これをオーバーロードします。関数の オーバーロードと似ています。

たとえば演算

X + Y

について考えます。XはクラスAのオブジェクトだとします。 この時X+を関数と考えて、Yを引数と思えばよいのです。 これをクラスAの定義部分に書けばよいことになります。 X+をfuncで置き換えるとfunc(Y)ということになります。 当然この関数には戻り値がありますからA func(Y)とか、 int func(Y)といった感じになります。

class A { public: //いろいろ・・・ void operator + (int i); void operator + (A Z); }; void A::operator + (int i) { //なんたらかんたら } void A::operator + (A Z) { //あーしろ、こーしろ }

といった感じで使います。「+」演算子が 2重に定義されています。しかし、引数?の違いで 区別できるのは関数のオーバーロードと同じです。

さて、オペレータ・オーバーロードの例題ですが たいていの参考書では、複素数(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++には複素数ライブラリというのがついています。 これに関しては、後の章で触れることにします。


[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Jan/19/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。