演算子のオーバーロード

今度は関数ではなく演算子(+,-,*など)をオーバーロードします。この方法は頻繁に使用されるので覚えておきましょう。



■演算子のオーバーロードの書式
戻り値 operator 演算子 (引数)

※引数はもともとの演算子が単項演算子であるか二項演算子であるかで引数の数が決定されます。単項演算子の場合は引数1個の関数またはフレンド関数、もしくは引数を持たないメンバ関数のいずれかになります。二項演算子の場合は引数2個の関数またはフレンド関数、もしくは引数1個のメンバ関数になります。

■演算子のオーバーロードのサンプル(以下ではクラスに対して「+,-」演算子が使用できるようになります。)
#include <iostream.h>
#include <stdio.h>

class Test
{
private:
 int buf1;
 int buf2;
public:
 Test(int a=0, int b=0){buf1=a,buf2=b;}
 void Show(){cout << "buf1=" <<buf1 << " buf2=" << buf2 << endl; }
 void Change(int a,int b){buf1=a,buf2=b;}
 //下記のTestは戻り値です。コンストラクタではありません。
 Test operator + (Test x);
 Test operator - (Test x);
};

//Testオブジェクト同士の加算
Test Test::operator + (Test x)
{
 Test _work;

 _work.buf1 = buf1 + x.buf1;
 _work.buf2 = buf2 + x.buf2;
 return _work;
}

//Testオブジェクト同士の減算
Test Test::operator - (Test x)
{
 Test _work;

 _work.buf1 = buf1 - x.buf1;
 _work.buf2 = buf2 - x.buf2;
 return _work;
}

int main(void)
{
 Test A(5, 10),B(0,10),C;

 //演算なし-----------------> 
 cout <<"演算無しの結果--->"<<endl;
 cout << "A(演算無し): ";
 A.Show();
 cout << "B(演算無し): ";
 B.Show();
 cout << "C(演算無し): ";
 C.Show();

 //加算----------------------------->
 cout <<"加算の結果------->"<<endl;
 cout << "A(A=A+A): ";
 A=A+A;
 A.Show();

 //Aを初期値に復元
 A.Change(5,10);
 cout<<"B(B=A+B): ";
 B=A+B;
 B.Show();

 //Bを初期値に復元
 B.Change(0,10);
 cout<<"C(C=B+C): ";
 C=B+C;
 C.Show();

 //Cを初期値に復元
 C.Change(0,0);

 //減算----------------------------->
 cout <<"減算の結果------->"<<endl;
 cout << "A(A=A-A): ";
 A=A-A;
 A.Show();

 //Aを初期値に復元
 A.Change(5,10);
 cout<<"B(B=A-B): ";
 B=A-B;
 B.Show();

 //Bを初期値に復元
 B.Change(0,10);
 cout<<"C(C=B-C): ";
 C=B-C;
 C.Show();

 getchar();
 return 0;
}

※結果は以下のように表示されます。







C++の基礎のページへ



ホーム PV ランキング