C++で演算子のオーバーロード

operator演算子

C++では自分の好きなように演算子を定義することができます。
例えばSTLでお馴染みのstringクラスでは、"+="演算子を利用して文字の連結処理を行うことができます。

string str1="sunny";
string str2=" day";
str1+= str2; //str1に"sunny day"が格納されている

演算子を使った文字列操作ですが、実は同じ処理を下のように書くこともできます。

string str1="sunny";
string str2=" day";
str1.operator +=(str2);		//str1 += str2;同じ処理
}

これはstringクラスが"operator+="というメンバ関数を持っているということになります。

void operator +=(std::string str);

また、2つのstringを連結する"+"演算子もよく利用されますが、先ほどと同様に書き換えることができます。

string str1="sunny";
string str2=" day";
cout << str1 + str2 <<endl;
string str1="sunny";
string str2=" day";
cout << operator+(str1,str2) <<endl;	//str1 + str2 と同じ処理

こちらはメンバ関数ではなく、下のような普通の関数として定義されています。

void operator +(std::string str1,std::string str2);

演算子は、特にメンバ関数や関数などの区別なく定義することができます。

type operator operatorname(arg1,arg2);

演算子の種類

自分で演算子を定義できるといっても、どんな記号の演算子でも対象になるわけではありません。
例えば下のように標準的に利用されるものが対象になります。

+, -, *, /, +=, -=, *=, /=,[],()
上の2つの例で見たように、引数の個数によっても定義することができる演算子の種類が限られます。

演算子オーバーロード

下のソースコードは、点の座標を加える演算子"+="を定義した例になります。

class Point{
public:
	double x;
	double y;
	Point(double x,double y);
	void operator+=(Point& point);
};

Point::Point(double x,double y){
	this->x=x;
	this->y=y;
}

void Point::operator+=(Point& point){
	x+=point.x;
	y+=point.y;
}
#include <iostream>
#include <string>
using namespace std;
int main(){
	Point p(1,2);
	Point q(3,4);
	p+=q;
	cout<<"("<<p.x<<","<<p.y<<")\n";
	return 0;
}

(4,6)