+演算子をオーバーロードしてオブジェクトp1,p2,p3を足し合わせるp1+p2+p3を実行してみる その際左側のオブジェクト同士の足し算から実行されることになります



つづき・・・



🌞   🌞   🌞   🌞   🌞   🌞   🌞



+演算子のオーバーロードにより


オブジェクトp1

オブジェクトp2

同士の足し算


p1+p2;


実行することができました


p1+p2;



引数にオブジェクトp2をもつ


オブジェクトp1のメンバ関数


p1.operator+(p2);


が実行されることに等しいのでした。



では


オブジェクトp1

オブジェクトp2

オブジェクトp3

3つのオブジェクト同士の足し算


p1+p2+p3;


は実行できるのかな~


どうかな~?


🌞   🌞   🌞   🌞   🌞   🌞   🌞



マックス「 p1+p2+p3;?


p1+p2;


は実行できる・・・


だが


p1+p2+p3;


は実行できるかどうか・・・


どうなってるんだ?


+演算子のオーバーロードにより


2つのオブジェクト同士を足し合わせることはできるんだろう


ふむ


p1+p2;



p1.operator+(p2);を表すなら


p1+p2+p3;



{p1.operator+(p2)}+p3;


ってことか?」


int(イント)「うわぁ」


ソーラー「ううん?


p1+p2+p3;



p1+p2;


が実行された後


(p1+p2)とp3が足し合わされる


(p1+p2)+p3;


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


どうかな・・・」


マックス「そういや


p1+p2

つまり

p1.operator+(p2)



p3


と同じく


Point型のオブジェクトを表すことになるのだったじゃないか


ということは・・・」


int(イント)「ということは


なんとか


(p1+p2)とp3は足しあわせることができそうじゃなぁい😊」


マックス「そうだな


p1+p2+p3;


が実行できるかどうか実際に


p1+p2+p3;


が記述されているプログラムを実行してみるか」



てんC「


それでは  みなさん


p1+p2+p3;


が記述されているプログラムを構成し実行してみます」


そのプログラムは こ・ち・ら💖

👇

#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.x = 3;

p3.y = 3;

p3.pointdisplay();


Point p4;

p4 = p1 + p2 + p3;

p4.pointdisplay();


return 0;

}


プログラムの実行結果


1

1

2

2

3

3

6

6


マックス「 p1+p2+p3;



実行出来たっぽいぞ


このプログラムはどういう構成になっているんだ」


てんC「


このプログラムでは


Point p1;


p1.x = 1;

p1.y = 1;

p1.pointdisplay();


により


1

1


Point p2;


p2.x = 2;

p2.y = 2;

p2.pointdisplay();


により

2

2


Point p3;


p3.x = 3;

p3.y = 3;

p3.pointdisplay();


により

3

3

コマンドプロンプト画面に表示しています


Point p4;


により


クラスPoint型のオブジェクト


p4を生成し


同じ


クラスPoint型のオブジェクトとなる


p1+p2+p3



クラスPoint型のオブジェクトp4に


代入しています


p1+p2+p3;


では


まず


左側の


p1+p2



実行されています。


その後


(p1+p2)+p3


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


まず


p1+p2


により


p1.operator+(p2)


が実行されています


p1.operator+(p2)が実行されると・・・


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

👇

Point Point::operator+(Point p)

{

Point a;


a.x = x + p.x;

a.y = y + p.y;


return a;

}

👆


Point a;


a.x = x + p.x;

a.y = y + p.y;


return a;



xにp1.x

yにp1.y


p.xにp2.x

p.yにp2.y



が代入された


Point a;


a.x=p1.x+p2.x;

a.y=p1.y+p2.y;


return a;


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


Point a;


により


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


a.x=p1.x+p2.x;

a.y=p1.y+p2.y;


の実行により


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


p1.x

p1.y



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


p2.x

p2.y


を足し合わせたものが


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


a.x

a.y


と代入されています


そして


return a;


の実行により


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


p1.operator+(p2)


つまり


p1+p2


には


戻り値として


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


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


すなわち


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


(p1+p2).x

(p1+p2).y


に相当するものに


p1.x+p2.x

p1.y+p2.y


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


クラスPoint型のメンバ関数


p1.operator+(p2)



実行されると


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

👇


Point Point::operator+(Point p)

{

Point a;


a.x = x + p.x;

a.y = y + p.y;


return a;

}

👆

内の


Point a;


a.x = x + p.x;

a.y = y + p.y;


return a;


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


実行後は


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


Point a;


により


生成された


クラスPoint型のオブジェクトaは消去されます


しかし


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


(p1+p2).x

(p1+p2).y


に相当するものには


ちゃんと戻り値として


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


a.x

a.y


すなわち


p1.x+p2.x

p1.y+p2.y


に格納されていた数値データ


3

3


が格納されています


                    😊次に😊


(p1+p2)+p3


により


(p1+p2).operator+(p3)


が実行されています


(p1+p2).operator+(p3)が実行されると


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

👇

Point Point::operator+(Point p)

{

Point a;


a.x = x + p.x;

a.y = y + p.y;


return a;

}

👆



Point a;


a.x = x + p.x;

a.y = y + p.y;


return a;



xに(p1+p2).x

yに(p1+p2).y


p.xにp3.x

p.yにp3.y



が代入された


Point a;


a.x=(p1+p2).x+p3.x;

a.y=(p1+p2).y+p3.y;


return a;


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


Point a;


により


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


a.x=(p1+p2).x+p3.x;

a.y=(p1+p2).y+p3.y;


の実行により


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


(p1+p2).x

(p1+p2).y



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


p3.x

p3.y


を足し合わせたものが


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


a.x

a.y


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


そのとき


クラスPoint型のメンバ関数


(p1+p2).operator+(p3)


つまり


(p1+p2)+p3


には


戻り値として


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


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


ですので


クラスPoint型のオブジェクト{(p1+p2)+p3}のメンバ変数


{(p1+p2)+p3}.x

{(p1+p2)+p3}.y


には


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


a.x

a.y


すなわち


(p1+p2).x+p3.x

(p1+p2).y+p3.y


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


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


(p1+p2).x

(p1+p2).y



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

p1.x

p1.y

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

p2.x

p2.y


を足し合わせた


p1.x+p2.x

p1.y+p2.y


に等しいので


クラスPoint型のオブジェクト{(p1+p2)+p3}のメンバ変数


{(p1+p2)+p3}.x

{(p1+p2)+p3}.y


つまり


クラスPoint型のオブジェクト

p1+p2+p3のメンバ変数


(p1+p2+p3).x

(p1+p2+p3).y


には


p1.x+p2.x+p3.x;

p1.y+p2.y+p3.y;


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



😊😊ちょっと解説

クラスPoint型のメンバ関数


(p1+p2).operator+(p3);


つまり


p1+p2+p3;



実行されると


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

👇


Point Point::operator+(Point p)

{

Point a;


a.x = x + p.x;

a.y = y + p.y;


return a;

}

👆

内の


Point a;


a.x = x + p.x;

a.y = y + p.y;


return a;


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


クラスPoint型のメンバ関数


(p1+p2).operator+(p3);


つまり


p1+p2+p3;


実行後は


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


Point a;


により


生成された


クラスPoint型のオブジェクトaは消去されますが


クラスPoint型のオブジェクトp1+p2+p3には


ちゃんと戻り値として返された


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


a.x

a.y


すなわち


p1.x+p2.x+p3.x

p1.y+p2.y+p3.y


の格納している数値データ


6

6

が格納されています


😊😊ちょっと解説でした




次に


p4 = p1 + p2 + p3;


の実行により


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


p4.x

p4.y



数値データ


6

6

が格納されています




そして


p4.pointdisplay();



実行されることにより


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


6

6


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


マックス「なるほど そういうことか


p1+p2+p3


では


左側のオブジェクト同士の足し算が優先されるわけだ」


ソーラー「だから


まず


p1+p2


が先に実行されるというわけなんだね」



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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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