演算子のオーバーロード

関数が引数の数や型の違いで挙動を変えることができるように、演算子も対象となる変数の型やオブジェクトの違いによって挙動を変えることができる・・・。これを演算子オーバーロードという・・・。

対象となるクラスや演算子によって書き方はいろいろ違うが、今回はx, yの2つの値を持った座標クラスclass_pointを定義して、2つの座標の加算'+'、代入'='、標準出力"<<"をオーバーロードしてみる・・・。

class_pointの定義は、

座標オブジェクト同士の加算により、座標オブジェクト自身が戻り値として返る場合の、'+'演算子オーバーロードは、

こんな風にoperator+というメンバ関数として書く・・・。
'+'の定義は、

2項演算子の'+'の左辺は、メンバの参照元オブジェクト自分自身(つまりthis)であり、右辺は引数で渡される・・・。
右辺がconst参照なのは、勝手に変更しないように、かつ、関数内部でコピーインスタンスを作るのは無駄なので参照でいいということで・・・。
戻り値は自分自身の参照を返したいので、*thisとしている・・・。
(引数や戻り値の書き方はいろいろあって、これが正しいかはあまり自信無い・・・。)

代入'='も同様に、

代入は左辺の要素の値をそれぞれ右辺の要素に代入・・・。

一方で出力"<<"はちょっと違う・・・。

メンバではなく、フレンド関数として宣言されている・・・。
定義は、

左辺が出力ストリームなので、第1引数はその参照が渡されるのでstd::ostream&・・・。
右辺は出力するオブジェクトなのでそれのconst参照・・・。
渡された出力ストリームに座標の出力フォーマットで出力してそれを返す・・・。

これでmain関数は、

いかにも、座標の加算、代入、出力っぽく見える・・・。

実行すると、

$ ./operator_overload
(60, 120)
$

座標の加算が出来てる・・・。

Sample/operator_overload.cpp at master · bg1bgst333/Sample · GitHub