🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
オブジェクトp1,p2同士の足し算p1+p2;を普通の自作関数operator+関数を設定することにより実行してみます
オブジェクトp1,p2同士の足し算p1+p2;を普通の自作関数operator+関数を設定することにより実行してみます
マックス「はっ
もしかして
クラスPoint型の
オブジェクトp1
と
オブジェクトp2
同士の足し算
p1+p2;
を実行して
オブジェクトp1のメンバ変数
p1.x
p1.y
オブジェクトp2のメンバ変数
p2.x
p2.y
同士の足し算
p1.x+p2.x
p1.y+p2.y
ができるよう
自作関数operator+関数の定義を設定していた場合
p1+p2;
が実行されるとき
自動的に
自作関数operator+関数の定義内容が実行されるように
C++言語では設計されているのか?
🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞
そうなんです
オブジェクトp1
と
オブジェクトp2
同士の足し算
p1+p2;
ができるよう
自作関数operator+関数の定義を設定していた場合
p1+p2;
が記述されていれば
自作関数operator+関数の定義内容が実行されることになります。
🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「そうか
あとは
自作関数operator+の定義内容
を
どうするかだよな
う~ん
そうだな
どうやって
クラスPoint型のオブジェクトp1
と
クラスPoint型のオブジェクトp2
同士の足し算
p1+p2;
を実行して
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
同士の足し算
p1.x+p2.x
p1.y+p2.y
ができるよう
自作関数operator+関数の定義を設定するか・・・・う~ん?
う~ん 」 」
int(イント)「ううう~んんん」
ソーラー「多分
自作関数operator+関数の引数部分に
operator+(Point p,Point q)
のように
クラスPoint型のオブジェクト宣言
Point p
Point q
を設定して
自作関数operator+関数が
クラスPoint型のオブジェクトp1
と
クラスPoint型のオブジェクトp2
を
引数に
持つことができるようにする必要があるんじゃないかな?」
マックス「ううん?」
ソーラー「そう設定しておいて
あとは😊
こんな風に
自作関数operator+関数の定義を設定すればいいんじゃないかな
👇
Point operator+(Point p,Point q){
Point a;
a.x=p.x+q.x;
a.y=p.y+q.y;
return a;
}
マックス「ぬわにぃ
もう
クラスPoint型の
オブジェクトp1
と
オブジェクトp2
同士の足し算
p1+p2;
を実行したとき
オブジェクトp1のメンバ変数
p1.x
p1.y
オブジェクトp2のメンバ変数
p2.x
p2.y
同士の足し算
p1.x+p2.x
p1.y+p2.y
ができるよう
自作関数operator+の
定義を完成させたのか?」
int(イント)「ソーラー すっごぉ~いい」
ソーラー「ははっ
ほとんど
いままでやってきたことの真似なんだけどね。」
マックス「なんで
自作関数operator+関数の定義
👇
Point operator+(Point p,Point q){
Point a;
a.x=p.x+q.x;
a.y=p.y+q.y;
return a;
}
👆はこんな風になっているんだにゃ」
ソーラー「このように
自作関数operator+関数の定義を設定していると
p1+p2;
が実行されると
ひょっとして
operator+(p1,p2);
が実行されるんじゃないかな?っておもうんだ」
🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞
そう、 わかっちゃった?
👇
Point operator+(Point p,Point q){
Point a;
a.x=p.x+q.x;
a.y=p.y+q.y;
return a;
}
👆
のように
自作関数operator+関数の定義が設定されていると
p1+p2;
が実行されると
operator+(p1,p2);
が実行されることになります
🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「
p1+p2;
が実行されると
p1.operator+(p2);
が実行されるんじゃなかったか?」
🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞
よくあるある、そのお話で もちきりです
p1+p2;
が実行されると
p1.operator+(p2);
が実行されるのは
operator+関数が
クラスPointのクラス宣言内で
クラスPointのメンバ関数宣言されていて
クラスPointのメンバ関数operator+関数
の定義が
たとえば
Point Point::operator+(Point p){
Point a;
a.x = x + p.x;
a.y = y + p.y;
return a;
}
と
記述されているときだけ💖です
自作関数operator+関数の定義が
👇
Point operator+(Point p,Point q){
Point a;
a.x=p.x+q.x;
a.y=p.y+q.y;
return a;
}
👆のように設定されている場合は
p1+p2;
が実行されると
operator+(p1,p2);
が実行されることになります
ここがポイントかな うふふ
2つのoperator+関数は
1つは
クラスのメンバ関数で
1つは
クラスのメンバ関数でない普通の自作関数なの(⋈◍>◡<◍)。✧♡
クラスのメンバ関数operator+の定義には
クラス名にスコープ解決演算子が付けられた
Point::
がもちいられているね
定義内容も違っているので
よく比べてみてね🌞
🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞
ソーラー「そう、やっぱりね🌞
p1+p2;
つまり
operator+(p1,p2);
が実行されると
自作関数operator+関数の定義
👇
Point operator+(Point p,Point q){
Point a;
a.x=p.x+q.x;
a.y=p.y+q.y;
return a;
}
👆
の定義内容
Point a;
a.x=p.x+q.x;
a.y=p.y+q.y;
return a;
が実行されるんだけど
そのとき
クラスPoint型のオブジェクト宣言
Point p;
Point q;
によって作製された
クラスPoint型のオブジェクトp
クラスPoint型のオブジェクトq
に
クラスPoint型のオブジェクトp1
クラスPoint型のオブジェクトp2
が代入された
Point a;
a.x=p1.x+p2.x;
a.y=p1.y+p2.y;
return a;
が実行されることになるよね」
マックス「
何で
aのオブジェクト宣言
Point a;
を実行しているんだ」
ソーラー「それも
今までやってきたことと同じことをやっているんだよ~
aのクラスPoint型のオブジェクト宣言
Point a;
を実行し
クラスPoint型のオブジェクトaの
メンバ変数
a.x
a.y
を生成しておけば
a.x
a.y
に
p1.x+p2.x;
p1.y+p2.y;
を
代入することができます。
後は
return a;
により
クラスPoint型のオブジェクトaを
operator+(p1,p2)
に戻り値として戻すんだよね。
そのために
自作関数operator+の定義
👇
Point operator+(Point p,Point q){
Point a;
a.x=p.x+q.x;
a.y=p.y+q.y;
return a;
}
で
Point operator+(Point p,Point q)
👆 👆 👆
と
自作関数operator+の戻り値を格納する型を
クラスPoint型に設定したんだよ
このようにしておけば
クラスPoint型のオブジェクトaを
operator+(p1,p2)
に戻り値として返すことができるよね😊
このとき
operator+(p1,p2)は
クラスPoint型のオブジェクトに相当するものになり
operator+(p1,p2)のメンバ変数
operator+(p1,p2).x
operator+(p1,p2).y
に
相当するものに
p1.x+p2.x
p1.y+p2.y
が代入されることになります
となると
クラスPoint型のオブジェクト宣言
Point p3;
によって
作製した
クラスPoint型のオブジェクトp3に
クラスPoint型のオブジェクトといえるoperator+(p1,p2)
が
p3=operator+(p1,p2);
と代入されたとき
クラスPoint型のオブジェクトp3のメンバ変数
p3.x
p3.y
に
クラスPoint型のオブジェクトoperator+(p1,p2)のメンバ変数
operator+(p1,p2).x
operator+(p1,p2).y
に相当するものが代入される
結果的には
p1.x+p2.x
p1.y+p2.y
が代入されることになります
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
に
1
1
が代入されていて
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
に
2
2
が代入されていれば
クラスPoint型のオブジェクトp3のメンバ変数
p3.x
p3.y
に
3
3
が代入されることになります
あとは
p3.pointdisplay();
を実行すれば
コマンドプロンプト画面に
3
3
が表示されるというわけです。
このように
自作関数operator+の定義を設定することにより
クラスPoint型の
オブジェクトp1
と
オブジェクトp2
同士の足し算
p1+p2;
を実行して
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
同士の足し算
p1.x+p2.x
p1.y+p2.y
が
実行できるようになるというわけです😊」
そのときのプログラムはこちらです。
👇
#include <iostream>
using namespace std;
class Point{
public:
int x;
int y;
public:
public:
void pointdisplay();
};
void Point::pointdisplay() {
cout << x << "\n";
cout << y << "\n";
}
Point operator+(Point p, Point q) {
Point a;
a.x = p.x + q.x;
a.y = p.y + q.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=operator+(p1,p2);と記述してもOKです🌞
p3.pointdisplay();
return 0;
}
プログラムの実行結果
1
1
2
2
3
3
ソーラー「このプログラムでは
Point p1;
p1.x = 1;
p1.y = 1;
p1.pointdisplay();
により
クラスPoint型のオブジェクトp1を生成し
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
に
1
1
を
代入し
1
1
を
コマンドプロンプト画面に
表示しています。
次に
Point p2;
p2.x = 2;
p2.y = 2;
p2.pointdisplay();
により
クラスPoint型のオブジェクトp2を生成し
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
に
2
2
を代入しコマンドプロンプト画面に
2
2
を
表示しています
次に
Point p3;
を実行し
クラスPoint型のオブジェクトp3を作製しています
次に
p3=p1+p2;
が実行されると
p3=operator+(p1,p2);
が実行されることになります。
p1+p2;
は
operator+(p1,p2);
に
等しいというわけです
すると
自作関数operator+(Point p, Point q)の定義
👇
Point operator+(Point p, Point q) {
Point a;
a.x = p.x + q.x;
a.y = p.y + q.y;
return a;
}
の定義内容
Point a;
a.x = p.x + q.x;
a.y = p.y + q.y;
return a;
の
p.xにp1.x
p.yにp1.y
q.xにp2.x
q.yにp2.y
が代入された
a.x = p1.x + p2.x;
a.y = p1.y + p2.y;
が実行されることになります
次に
return a;
が実行されると
operator+(p1,p2)には
戻り値として
クラスPoint型のオブジェクトaが返されることになります。
このとき
クラスPoint型のオブジェクトaのメンバ変数
a.x
クラスPoint型のオブジェクトaのメンバ変数
a.y
に
p1.x+p2.x
p1.y+p2.y
が代入されていますね
クラスPoint型のオブジェクトaが
operator+(p1,p2)に
戻り値として返されることになるので
クラスPoint型のオブジェクトoperator+(p1,p2)のメンバ変数
operator+(p1,p2).x
operator+(p1,p2).y
に相当するものに
クラスPoint型のオブジェクトaのメンバ変数
a.x
クラスPoint型のオブジェクトaのメンバ変数
a.y
すなわち
p1.x+p2.x
p1.y+p2.y
が代入されていることになります。
ですので
さらに
p3=operator+(p1,p2);
が実行されると
クラスPoint型のオブジェクトp3のメンバ変数
p3.x
p3.y
に
operator+(p1,p2).x
operator+(p1,p2).y
に相当するものが代入される
つまり
p1.x+p2.x
p1.y+p2.y
が代入されることになります。
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
に
1
1
が代入されていて
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
に
2
2
が代入されているので
クラスPoint型のオブジェクトp3のメンバ変数
p3.x
p3.y
に
3
3
が代入されることになります
そして仕上げで
p3.pointdisplay();
の実行により
コマンドプロンプト画面に
3
3
が表示されているというわけです
p1+p2;
が実行されて
p1.x+p2.x
p1.y+p2.y
が実行されたってわけだね」
int(イント)「見事な解説ね ソーラーさん やったね。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます