p1+p2;つまり引数にオブジェクトp2が代入されたオブジェクトp1のメンバ関数p1.operator+(p2);が実行されるには先にオブジェクトp1,オブジェクトp2が生成されている必要があります

マックス「いよいよかん🍊(´▽`*)


通常


クラスPoint型のオブジェクトp1,p2同士を足し合わせる


             p1+p2;


は実行できないが


+演算子のオーバーロード(新たな定義の追加)を実行すると


クラスPoint型のオブジェクトp1,p2同士を足し合わせる


             p1+p2;


が実行できるようになるんだろう


だが


             p1+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;



考察をしてみれば


             つまり(笑)


             p1+p2


何を意味しているのか?


             p1+p2;


が実行されると

何が起こるのか? 




         つまり



             p1.operator+(p2)



が何を意味しているのか


             p1.operator+(p2);



が実行されると

何が起こるのか? 


が分かるようになるわけか


ではさっそく・・・・・




🌞   🌞   🌞   🌞   🌞   🌞   🌞


    はい😊  マックスさん


    はい😊  こっち こっち


      ついてきてね。


🌞   🌞   🌞   🌞   🌞   🌞   🌞




マックス「わんわん ぴょ~ん」




🌞   🌞   🌞   🌞   🌞   🌞   🌞



             つまり(笑)


             p1+p2


何を意味しているのか?


             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;


について


        考察するその前に


         💖その前に💖



知っておくことがあります。


    p1+p2;


        つまり


          p1.operator+(p2);


が実行されるためには


ある命令文が前もって実行されている必要があります。


その命令文とは何のことでしょうか?


             ふふっぅ



🌞   🌞   🌞   🌞   🌞   🌞   🌞



マックス「へ?


            p1+p2;


        つまり


          p1.operator+(p2);


が実行されるためには


ある命令文が前もって実行されている必要がある・・?


そんなの?なんかあるのか?」


ソーラー「ふ~ 追いついたっと💖」



🌞   🌞   🌞   🌞   🌞   🌞   🌞


            p1+p2;


        つまり


          p1.operator+(p2);



よ~く観察すれば わ・か・る・ん・だけど(´▽`*)


🌞   🌞   🌞   🌞   🌞   🌞   🌞



マックス「


           p1+p2;


        つまり


          p1.operator+(p2);


をよく観察・・・か?


ふむ、わからん」


ソーラー「う~ん


           p1+p2;


        つまり


          p1.operator+(p2);


が実行されるためには


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


p1.operator+(Point p)


の引数部分の


Point p



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


p2


が代入されている必要があるよね。


あっ わかった!」


マックス「もう、わかったのか?」



ソーラー「


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


p1.operator+(Point p)


が生成されるためには


p1のオブジェクト宣言


Point p1;



実行されている必要があります。


同様に


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


p1.operator+(Point p)


の引数部分の


Point p



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


p2


を代入するためには


p2のオブジェクト宣言


Point p2;



実行されている必要があります。




つまり


              p1+p2;


              すなわち


             p1.operator+(p2);


が実行されるためには



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


             Point p1;



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


Point p2;



実行されて


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


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



生成されている必要があるわけだね。」


🌞   🌞   🌞   🌞   🌞   🌞   🌞


          そのとおりなんです


              p1+p2;


              すなわち


    引数にオブジェクトp2が代入されたクラスPoint型のオブジェクトp1のメンバ関数


             p1.operator+(p2);


が実行されるためには


             そもそも


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


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



生成されていないと



             💖無理💖



ですね。



いよいよかな


🌞   🌞   🌞   🌞   🌞   🌞   🌞



マックス「そういわれてみれば・・・そうだな」



🌞   🌞   🌞   🌞   🌞   🌞   🌞


では もう1度


今、何をしようとしているか


の確認をしてみたいと思います。


通常


         +演算子には


数値データ1と2

1+2;

のように足し合わせる機能や


変数aや変数bを


a+b;


のように


足し合わせる機能があるのですが


オブジェクトp1とオブジェクトp2を


p1+p2;


のように足し合わせる機能はありません


そこで


p1+p2;


が実行できるよう


新たに


+演算子に


+演算子の機能を追加したいというわけです。


もう少し詳しく説明すると


次のようなクラスPointがあるとします。

👇

class Point{


public:

int x;

int y;


public:


void pointdisplay();


public:


};


void Point::pointdisplay() {


cout << x << "\n";

cout << y << "\n";

}



👆


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


Point p1;

Point p2;


を実行すると


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


p1.x

p1.y


オブジェクトp2のメンバ変数


p2.x

p2.y


が生成されます。


p1.x+p2.x

p1.y+p2.y



記述すれば


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


p1.x

p1.y


オブジェクトp2のメンバ変数


p2.x

p2.y


を足し合わせることができるのですが


         p1+p2;



記述するだけで


直接

p1.x+p2.x

p1.y+p2.y


を記述することなく


p1.x+p2.x

p1.y+p2.y


が実行できるようにしたいというわけです。


そして


さらに


p1+p2を


同じクラスPoint型のオブジェクトp3に


p3=p1+p2;



代入することができれば


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


p3.x

p3.y

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

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



p1.x+p2.x;

p1.y+p2.y;


が代入できるというわけです。


後は

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


p3.pointdisplay();


を実行すれば


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

p1.x

オブジェクトp2のメンバ変数

p2.x



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

p1.y

オブジェクトp2のメンバ変数

p2.y


を足し合わせたものが


簡単に表示できるというわけです


そのことを示すプログラムがこちらでした。


🌞   🌞   🌞   🌞   🌞   🌞   🌞

👇

#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;

}


ビルド実行結果


1

1

2

2

3

3


🌞   🌞   🌞   🌞   🌞   🌞   🌞


ソーラー「う~んん?


ビルド実行結果をみると


p1+p2;


が実行されただけで


p1.x+p2.x;

p1.y+p2.y;


が実行されているようだけど・・・


どうして


p1+p2;


が実行されただけで


p1.x+p2.x;

p1.y+p2.y;


が実行されるのかな?


その秘密は


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

👇


Point Point::operator+(Point p)

{

Point a;


a.x = x + p.x;

a.y = y + p.y;


return a;

}

👆

にありそうだね


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


何を意味しているのかが分からないと


どうして


p1 + p2;


が実行されただけで


p1.x+p2.x;

p1.y+p2.y;


が実行されるのか?


ちょっとわからないね」                 」



てんC「はい、ソーラーさん


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


p1.operator+(p2);


が実行されるとき


何が実行されるかは


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


次第というわけですね。」



🌞   🌞   🌞   🌞   🌞   🌞   🌞


それでは


               p1 + 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;

}



参照しながら


          観察(´▽`*)観察(´▽`*)してみよう


🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   




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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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