見出し画像

演算子のオーバーロード|c++

c++の勉強を進めていて演算子のオーバーロードについて勉強したけど、とても分かりにくかったのでメモ。

ここでは+演算子だけ理解します。

そもそもオーバーロードについて忘れがちなので軽く復習

オーバーロードとは

同じ名前の関数を2個とか定義したらエラーになりそうに思えるけど、

同じ名前の関数や演算子を何個も定義できることをオーバーロードという。

class A {

int hoge():

char hoge(a, b);

};

みたいにhoge()を何個も定義できる。戻り値の型や仮引数の数、型で区別される。

上記でも、判断できないようなあいまいさがあると、エラーが発生する。


演算子のオーバーロード

演算子のオーバーロードは 「+ - * =」などの演算子に対して、オーバーロードができる。

つまり関数のオーバーロードと同じように、1つの演算子に対して複数の意味、機能を持たせることができる。

演算子のオーバーロードに意味があるのかなと思ったけど、通常ならエラーとなってしまうインスタンス同士の足し算ができるようになるといったメリットがある。


通常なら、+,-などの演算子は、数値や文字列のような特定のデータ型やクラスにしか利用できないので、利用できない型やクラスで足し算するとエラーになる。

でも、自分で定義することで演算子を使った計算を機能を拡張できる。

クラス内で独自に足し算や引き算など定義することが演算子のオーバーロード。

オーバーロードせず足し算をするとエラーがでたりコードの見た目が分かりにくくなると仮定すると、

メインの処理で足し算をシンプルな見た目でできるようにするために、足し算の機能をあらかじめ別で用意して作っておくということが演算子のオーバーロードの使いどころかも。


#include <iostream>

usin namespace std;


class Sample
{
   int num;
public:
   // +演算子のオーバーロード
   Sample operator+(Sample b)
   {
       Sample a;
       a.num = this->num + b.num;
       return a;
   }
   Sample(int x = 0) { num = x; }
   int get() { return num; }
};

int main()
{
   Sample a1(100), a2(200);
   Sample a3 = a1 + a2;
   cout << a3.get() << endl;
   return 0;
}

Sample operator+(Sample b)

今回はインスタンス同士を足し算させるので、型はクラス型にする。

仮引数のSample bは足し算の+右側、右辺を意味する。

左辺は左辺に指定したインスタンスが適用される。
上記の例ではa1 + a2のa1が左辺として認識され、a1の値はthis->numで取得される。

→右辺は明示しているので、左辺は暗黙的にthis->numまたはnumとするだけで良いこととなっている。

最後のストリームでcout  << a3 <<  endl;とすると、a3はクラス型でa3インスタンスなのでエラーとなるので、a3のnumをa3.get()として得て出力させる。





この記事が気に入ったらサポートをしてみませんか?