🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
おさらいですがオブジェクトのメンバ関数が実行されるときオブジェクトのメンバ変数がクラスのメンバ関数の定義内のクラスのメンバ変数に代入されたものが実行されることになります
おさらいですがオブジェクトのメンバ関数が実行されるときオブジェクトのメンバ変数がクラスのメンバ関数の定義内のクラスのメンバ変数に代入されたものが実行されることになります
🌞 🌞 🌞 🌞 🌞 🌞 🌞
では もう1度
今、何をしようとしているか
の確認をしてみたいと思います。
通常
+演算子には
数値データ1と2
を
1+2;
のように足し合わせる機能や
変数aや変数bを
a+b;
のように
足し合わせる機能があるのですが
オブジェクトp1とオブジェクトp2を
p1+p2;
のように足し合わせる機能はありません
そこで
p1+p2;
が実行できるよう
+演算子に
新たな機能を追加したいというわけです。
もう少し詳しく説明すると
次のようなクラスPointとそのメンバ関数pointdisplay()の定義があるとします。
👇
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;
を実行すると
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
が生成されます。
p1.x+p2.x;
p1.y+p2.y;
と
記述すれば
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
を足し合わせることができるのですが
クラスPoint型のオブジェクト同士を足し合わせる
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
が代入することができたらいいな
というわけです
後は
クラスPoint型のオブジェクトp3のメンバ関数
p3.pointdisplay();
を実行すれば
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
と
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
クラスPoint型のオブジェクトp1のメンバ変数
p1.y
と
クラスPoint型のオブジェクト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.operator+(p2);
が実行されると
p1.x+p2.x;
p1.y+p2.y;
が実行されているようだけど・・・
どうして
p1+p2;
すなわち
p1.operator+(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;
}
にありそうだね。
🌞 🌞 🌞 🌞 🌞 🌞 🌞
それでは
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;
}
を
参照しながら
観察(´▽`*)観察(´▽`*)してみよう
🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「これは・・・
俺にとって
とてもとても基本的なことなんだが
p1+p2;
すなわち
💖クラスPoint型のオブジェクトp1のメンバ関数💖
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型のオブジェクトp1のメンバ関数💖
p1.operator+(p2);
が
実行されると
何がどう、なるのか?
まったく、どうなるのかさっぱり
さっぱりわからにゃい」
」
ソーラー「
💖クラスPoint型のオブジェクトp1のメンバ関数💖
p1.operator+(p2);
が
実行されると
何が実行されるか?
ここはとても基本的なところです🌞
基本的に
💖オブジェクトのメンバ関数💖
が
実行されるとき
💖オブジェクトのメンバ変数💖
が
クラスのメンバ関数の定義内の
クラスのメンバ変数に
代入されたものが実行されることになります。
」
」
マックス「にゃんん😽 なんのことだお?」
ソーラー「
このことは
とても基本的で大切な事柄で
クラスに関しての最初の方のエピソードでも
でてきたお話です。
例えば・・・
次のプログラムをご覧ください
#include <iostream>
using namespace std;
class Cube{
public:
int no; //変数noはクラスCubeのメンバ変数とよばれます
float tate; //変数tateはクラスCubeのメンバ変数とよばれます
float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます
float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます
void display(); //自作関数display()はクラスCubeのメンバ関数とよばれます
};
void Cube::display() {
cout << "立方体につけられたナンバーは" << no << "です" << "\n";
cout << "立方体の縦の長さは" << tate << "です" << "\n";
cout << "立方体の横の長さは" << yoko << "です" << "\n";
cout << "立方体の高さの長さは" << takasa << "です" << "\n";
}
//👆クラスCubeのメンバ関数となっている自作関数display()の定義をおこなっています
int main() {
Cube cube1;
//👆cube1のクラスCube型のオブジェクト宣言をおこなっています
cube1.no = 1;
cube1.tate = 2.0;
cube1.yoko = 3.0;
cube1.takasa = 4.0;
cube1.display();
return 0;
}
ビルド実行結果
立方体につけられたナンバーは1です
立方体の縦の長さは2です
立方体の横の長さは3です
立方体の高さの長さは4です
ソーラー「このプログラムでは
cube1のクラスCube型のオブジェクト宣言
Cube cube1;
により生成された
クラスCube型のオブジェクトcube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に
立方体cube1のデータ
立方体につけられたナンバー 1
立方体の縦の長さ 2.0
立方体の横の長さ 3.0
立方体の高さ 4.0
を
cube1.no = 1;
cube1.tate = 2.0;
cube1.yoko = 3.0;
cube1.takasa = 4.0;
と格納しています
そして次は
クラスCube型のオブジェクトcube1のメンバ関数
cube1.display();
が実行されています。
💖ここからが注目です💖
cube1.display();
が実行されると
クラスCubeのメンバ関数display()の定義内の
👇
void Cube::display() {
cout << "立方体につけられたナンバーは" << no << "です" << "\n";
cout << "立方体の縦の長さは" << tate << "です" << "\n";
cout << "立方体の横の長さは" << yoko << "です" << "\n";
cout << "立方体の高さの長さは" << takasa << "です" << "\n";
}
の
cout << "立方体につけられたナンバーは" << no << "です" << "\n";
cout << "立方体の縦の長さは" << tate << "です" << "\n";
cout << "立方体の横の長さは" << yoko << "です" << "\n";
cout << "立方体の高さの長さは" << takasa << "です" << "\n";
が実行されるわけですが
このとき おもしろいことに
💖 💖 💖
no
tate
yoko
takasa
💖 💖 💖
は
🌞 🌞 🌞 🌞 🌞
クラスCube型のオブジェクトcube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
🌞 🌞 🌞 🌞 🌞
をあらわすことになり
cout << "立方体につけられたナンバーは" <<cube1.no << "です" << "\n";
cout << "立方体の縦の長さは" << cube1.tate << "です" << "\n";
cout << "立方体の横の長さは" <<cube1. yoko << "です" << "\n";
cout << "立方体の高さの長さは" << cube1.takasa << "です" << "\n";
が実行されることになります。
そして
cube1.display();
の実行の前に
すでに
cube1.no = 1;
cube1.tate = 2.0;
cube1.yoko = 3.0;
cube1.takasa = 4.0;
が実行されていることにより
cout << "立方体につけられたナンバーは" <<cube1.no << "です" << "\n";
cout << "立方体の縦の長さは" << cube1.tate << "です" << "\n";
cout << "立方体の横の長さは" <<cube1. yoko << "です" << "\n";
cout << "立方体の高さの長さは" << cube1.takasa << "です" << "\n";
の
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
の部分には
クラスCube型のオブジェクトcube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
が
格納している数値データ
1
2.0
3.0
4.0
が
代入されることになります。
よって
ビルド実行結果に
立方体につけられたナンバーは1です
立方体の縦の長さは2です
立方体の横の長さは3です
立方体の高さの長さは4です
が
表示されることになります」
マックス「・・・ということは?」
ソーラー「えへ😊・・・ということは・・・
同様に
p1+p2;
すなわち
💖クラスPoint型のオブジェクトp1のメンバ関数💖
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にクラスPoint型のオブジェクトp1のメンバ変数p1.x🌞🌞🌞
🌞🌞🌞yにクラスPoint型のオブジェクトp1のメンバ変数p1.y🌞🌞🌞
が
🌞🌞🌞代入された🌞🌞🌞
Point a;
a.x =p1.x + p.x;
a.y =p1.y+ p.y;
return a;
が実行されることになります
マックス「なんと
そんな仕組みになっているのか?
Point a;
a.x = x + p.x;
a.y = y + p.y;
return a;
の
x
と
y
は何を意味しているのか
さっぱり
ぜんぜん
ちっ~とも
わんわんわお~ん
と
わからなかったが
そんな単純なことだったのか?
のたうちまわったぜぇ~~~~~
」
int(イント)「マックス😊 面白~い」
ソーラー「さらに
今 実行しようとしている
p1.operator+(p2);
は
クラスPoint型のオブジェクトp1のメンバ関数
p1.operator+(Point p);
の
引数部分の
クラスPoint型のオブジェクト宣言
Point p
に
クラスPoint型のオブジェクト
p2
が代入されている
すなわち
クラスPoint型のオブジェクトpに
クラスPoint型のオブジェクトp2
が
代入される
p=p2;
が実行されています。
ですので
p1.operator+(p2);
が実行されるとき
クラスPointのメンバ関数operator+関数の定義
👇
Point a;
a.x = x + p.x;
a.y = y + p.y;
return a;
の
🌞🌞🌞xにクラスPoint型のオブジェクトp1のメンバ変数p1.x🌞🌞🌞
🌞🌞🌞yにクラスPoint型のオブジェクトp1のメンバ変数p1.y🌞🌞🌞
が
🌞🌞🌞代入され🌞🌞🌞
💖 💖 💖 💖 💖 💖 💖 💖 💖 💖
クラスPoint型のオブジェクトpのメンバ変数p.x
クラスPoint型のオブジェクトpのメンバ変数p.y
に
クラスPoint型のオブジェクトp2のメンバ変数p2.x
クラスPoint型のオブジェクトp2のメンバ変数p2.y
💖 💖 💖 💖 💖 💖 💖 💖 💖 💖
💖が代入された💖
Point a;
a.x =p1.x + p2.x;
a.y =p1.y+ p2.y;
return a;
が実行されることになります てね」
マックス「おお・・・
ソーラーよ
なんか・・・ 冴えてるな~」
ソーラー「いやあ~それほどでも~」
てんC「😊」
ソーラー「
つまり まとめると
p1+p2;
すなわち
💖クラスPoint型のオブジェクトp1のメンバ関数💖
p1.operator+(p2);
が
実行されると
Point a;
a.x =p1.x + p2.x;
a.y =p1.y+ p2.y;
return a;
が実行されることになります」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます