operator+関数の引数にはオブジェクトだけでなくint型の変数なども設定することができます

p1+5;を実行してみたい p1+p2;はp1.operator+(p2)を表しています。引数を何に持つかの設定は自由なのでオブジェクトp2の代わりにint型の変数bをとることもできます

つづき・・・


マックス「+演算子のオーバーロードが用いられた


プログラムか・・・


いいプログラムじゃないか


みつづけていると


なんだか


愛着がわいてきたじゃないか」

👇


#include <iostream>


using namespace std;


class Point{


public:

int x;

int y;


public:


void pointdisplay();


public:


Point operator+(Point p);


};


void Point::pointdisplay() {


cout << x << "\n";

cout << y << "\n";

}



Point Point::operator+(Point p)

{

Point a;


a.x = x + p.x;

a.y = y + p.y;


return a;

}




int main() {



Point p1;


p1.x = 1;

p1.y = 1;

p1.pointdisplay();



Point p2;


p2.x = 2;

p2.y = 2;

p2.pointdisplay();


Point p3;


p3 = p1 + p2;

p3.pointdisplay();


return 0;

}


プログラムのm実行結果


1

1

2

2

3

3




マックス「いいプログラムだあ


p1+p2;



クラスPoint型のオブジェクトp1のメンバ関数


p1.operator+(p2);


を表しているんだろう


p1.operator+(p2);



引数としてオブジェクトp2


を持っているわけだ


なぜ


引数としてオブジェクトp2をもつのかというと


引数としてオブジェクトがもてるように


🍓クラスPointのメンバ関数であるoperator+関数の定義を


行ったからだ🍓


こんなふうにな


👇


Point Point::operator+(Point p){


Point a;


a.x = x + p.x;

a.y = y + p.y;


return a;

}


👆

この


Point Point::operator+(Point p)



Point p


をみれば


このクラスPointのメンバ関数operator+関数が


引数としてオブジェクトをもつのがわかるだろう


Point pにクラスPoint型のオブジェクトが代入されるんだ


ということは


Point Point::operator+(int b){


Point a;


a.x = x + b;

a.y = y + b;


return a;

}



のように


クラスPointのメンバ関数operator+関数の定義を設定すれば


クラスPointのメンバ関数operator+関数の引数として


int型の変数や数値データを


int bに代入できるんじゃないか?


たとえば


p1+5;


と記述されていたなら


引数部分のint bに5が代入された


クラスPoint型のオブジェクトp1のメンバ関数operator+


p1.operator+(5);


が実行されるという具合にだ      


そう思わないか?」


ソーラー「ああっ ほんとだあ


なんていい発想・・・なんだ」


🌞   🌞   🌞   🌞   🌞   🌞   🌞


そこに気づくなんて なんて運動神経・・・・・


🌞   🌞   🌞   🌞   🌞   🌞   🌞



マックス「ははは~ 運動神経なら まっかせろぉ


ただ


この


クラスPointのメンバ関数operator+関数の定義


👇の意味はわからんがなあ」



Point Point::operator+(int b){


Point a;


a.x = x + b;

a.y = y + b;


return a;

}


int(イント)「え~」


ソーラー「これは いがいと簡単じゃないかな?


例えば


クラスPoint型のオブジェクトp1が生成されていて


p1.x

p2.y


には


1

1


代入されているとします


通常


クラスPoint型のオブジェクトp1に普通の数値データを足し合わせる


            p1+5;


を実行することはできないよね


でも


以下の

👇

Point Point::operator+(int b){


Point a;


a.x = x + b;

a.y = y + b;


return a;

}



👆のように


クラスPoint型のメンバ関数operator+関数の定義が行われている状態で


p1+5;


つまり


p1.operator+(5);



実行されたら


Point a;


a.x = x + b;

a.y = y + b;


return a;




xにp1.x

yにp1.y


bに5が


代入された


Point a;


a.x =p1.x +5;

a.y =p1.y +5;


return a;



実行されるんじゃないかな?


p1.x

p2.y


には


1

1


代入されているので


a.x =1+5;

a.y =1+5;


a.x =6;

a.y =6;


が実行されることになるね。


クラスPoint型のオブジェクトaのメンバ変数


a.x

a.y


6

6

の値を持つことになるよね。


そして


return a;


のはたらきにより


そのクラスPoint型のオブジェクトaが


戻り値として


p1.operator+(5)


に返されるって感じかな?」



マックス「やるな~」


ソーラー「まあ、実際に


クラスPointのメンバ関数operator+関数の定義


👇


Point Point::operator+(int b){


Point a;


a.x = x + b;

a.y = y + b;


return a;

}


が用いられたプログラムを構成して実行してみれば


何がおこるかすぐにわかるね。


そのプログラムはこちらとなります。」

👇


#include <iostream>


using namespace std;


class Point{


public:

int x;

int y;


public:


void pointdisplay();


public:


Point operator+(int b);


};


void Point::pointdisplay() {


cout << x << "\n";

cout << y << "\n";

}



Point Point::operator+(int b)

{

Point a;


a.x = x + b;

a.y = y + b;


return a;

}




int main() {



Point p1;


p1.x = 1;

p1.y = 1;

p1.pointdisplay();


Point p2;


p2 = p1 + 5;

p2.pointdisplay();


return 0;

}


プログラムの実行結果



1

1

6

6


ソーラー「やっぱり そうか


このプログラムでは何が実行されているのかというと



p1のクラスPoint型のオブジェクト宣言


Point p1;


により


クラスPoint型のオブジェクトp1が生成されています


生成された


クラスPoint型のオブジェクトp1のメンバ変数


p1.x

p2.y


には


p1.x = 1;

p1.y = 1;


の実行により


1

1



代入されています


そして


p1+5;


つまり

クラスPoint型のオブジェクトp1のメンバ関数 


p1.operator+(5);



実行されます


すると


クラスPointのメンバ関数operator+関数の定義内の


Point a;


a.x = x + b;

a.y = y + b;


return a;


が実行されることになります


このとき


xにオブジェクトp1のメンバ変数p1.x

yにオブジェクトp1のメンバ変数p1.y


bに5が


代入された


Point a;


a.x =p1.x +5;

a.y =p1.y +5;


return a;



実行されることになります


p1.x

p2.y


には


1

1


代入されているので


a.x =1+5;

a.y =1+5;


a.x =6;

a.y =6;


が実行されることになるね。


ですので


クラスPoint型のオブジェクトaのメンバ変数


a.x

a.y


6

6

の値を持つことになるね。


そして


そのクラスPoint型のオブジェクトaが


戻り値として


p1.operator+(5)


に返されることになります


p1.operator+(5)=a;


が実行される感じだね


クラスPointのメンバ関数operator+関数の定義により


p1.operator+(5)に戻された戻り値は


Point型の形式でメモリに格納されることになります


つまり


p1.operator+(5)は


         あたかも


クラスPoint型のオブジェクトであり


クラスPoint型のオブジェクトp1.operator+(5)


のメンバ変数


{p1.operator+(5)}.x

{p1.operator+(5)}.y


には


a.x

a.y


が代入されるので


6

6

が代入されていることになるね。


あとは


p2 = p1 + 5;


つまり


p2 =p1.operator+(5);


が実行されると


クラスPoint型のオブジェクトp2のメンバ変数

p2.x

p2.y


クラスPoint型のオブジェクトp1.operator+(5)


のメンバ変数


{p1.operator+(5)}.x

{p1.operator+(5)}.y


が代入されることになります


{p1.operator+(5)}.x

{p1.operator+(5)}.y


には


6

6

が代入されているので


クラスPoint型のオブジェクトp2のメンバ変数

p2.x

p2.y

6

6

が代入されることになります


そして


p2.pointdisplay();


の実行により


コマンドプロンプト画面に


6

6


が表示されることになります」



マックス「新たな+演算子の定義を設定することができたわけだ」


ソーラー「+演算子のオーバーロード


では


自由に


operator+関数の定義を設定することができるんだね。


だから


引数にオブジェクトでなくふつうの変数を設定することもできるんだね。


楽しい解説だっだな~ 」




  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る