🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
p1+p2;つまり引数にオブジェクトp2が代入されたオブジェクトp1のメンバ関数p1.operator+(p2);が実行されるには先にオブジェクトp1,オブジェクトp2が生成されている必要があります
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;
}
を
参照しながら
観察(´▽`*)観察(´▽`*)してみよう
🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます