🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
前のエピソードのoperator++関数の定義を変更して後置演算子++のオーバーロードを実行してみたいと思います
前のエピソードのoperator++関数の定義を変更して後置演算子++のオーバーロードを実行してみたいと思います
🌞 🌞 🌞 🌞 🌞 🌞 🌞
普通は実行できない
後置演算子++をオブジェクトp1に作用させた
p1++;
を実行して
オブジェクトp1のメンバ変数
💖p1.x💖
💖p1.y💖
に格納されている値を
1増やすことができるよう
後置演算子++のオーバーロードを実行しました
そのプログラムはこちらです
👇
#include <iostream>
using namespace std;
class Point{
public: //アクセス指定子がpublicに設定されています
int x;
int y;
public:
void pointdisplay();
public:
Point operator++(int i);
};
void Point::pointdisplay() {
cout << x << "\n";
cout << y << "\n";
}
Point Point::operator++(int i) {
Point a;
a.x = x++;
a.y = y++;
return a;
}
int main() {
Point p1;
p1.x = 1;
p1.y = 1;
p1.pointdisplay();
Point p2;
p2=p1++;
p1.pointdisplay();
p2.pointdisplay();
return 0;
}
プログラムの実行結果
1
1
2
2
1
1
👆
このプログラムのように
後置演算子++演算子のオーバーロードを実行するには
operator++関数の
クラスPointのメンバ関数宣言を行い
クラスPointのメンバ関数であるoperator++関数の定義
を設定するんだけど
その方法はよくわかったぁ?~😊
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「はは よくわかった
実はな
俺は
別の方法で
後置演算子++をクラスPoint型のオブジェクトp1に作用させた
p1++;
を実行したとき
クラスPoint型のオブジェクトp1のメンバ変数
💖p1.x💖
💖p1.y💖
に格納されている数値データを
1増やすことができるよう
後置演算子++のオーバーロードを実行する方法をおもいついたんだ
どうだあ
その方法とは
今のプログラムの
クラスPointのメンバ関数であるoperator++関数の定義
の設定の部分を変えるというものなのだ
くっくっくっ
どうするかというとだな・・・・・」
ソーラー「その方法とは
クラスPointのメンバ関数であるoperator++関数の定義に
ポインタ変数thisを用いるというものなんです
つまり
今のプログラムの
クラスPointのメンバ関数であるoperator++関数の定義
👇
Point Point::operator++(int i) {
Point a;
a.x = x++;
a.y = y++;
return a;
}
を
前のエピソードで登場したポインタ変数thisを用いて
Point Point::operator++(int i) {
Point a=*this;
x = x+1;
y = y+1;
return a;
}
とかきかえるんです
さきほどの
書き換える前と
今の
書き換えた後の
クラスPointのメンバ関数であるoperator++関数の定義は
内容的には一緒なんだよ」
マックス「お、おい(*´▽`*)」
ソーラー「とりあえず
今さっきのプログラムの
クラスPointのメンバ関数であるoperator++関数の定義を
👇
Point Point::operator++(int i) {
Point a=*this;
x = x+1;
y = y+1;
return a;
}
👆
と書き換えたプログラムを実行してみたいと思います
そのプログラムの実行結果はこちらです。
👇
#include <iostream>
using namespace std;
class Point{
public: //アクセス指定子がpublicに設定されています
int x;
int y;
public:
void pointdisplay();
public:
Point operator++(int i);
};
void Point::pointdisplay() {
cout << x << "\n";
cout << y << "\n";
}
Point Point::operator++(int i) {
Point a = *this;
x = x +1;
y = y +1;
return a;
}
int main() {
Point p1;
p1.x = 1;
p1.y = 1;
p1.pointdisplay();
Point p2;
p2 = p1++;
p1.pointdisplay();
p2.pointdisplay();
return 0;
}
プログラムの実行結果
1
1
2
2
1
1
ソーラー「このプログラムでは何がおこなわれているかというと
Point p1;
p1.x = 1;
p1.y = 1;
により
クラスPoint型のオブジェクトp1が生成されて
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
に
1
1
が代入されています
そして
クラスPoint型のオブジェクトp1のメンバ関数
p1.pointdisplay();
の実行により
1
1
がコマンドプロンプト画面に表示されています
次に
p2のクラスPoint型のオブジェクト宣言
Point p2;
により
クラスPoint型のオブジェクトp2が作製され
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
が生成されています
そして
p2=p1++;
が実行されると
まず
p1++により
🍎クラスPoint型のオブジェクト
クラスPointのメンバ関数operator++関数の定義
👇
Point Point::operator++(int i) {
Point a = *this;
x = x +1;
y = y +1;
return a;
}
の
🍎
x
y
に
p1.x
p1.y
が代入された
🍎
Point a = *this;
p1.x =p1.x +1;
p1.y =p1.y +1;
return a;
が
実行されることになります
さあ
Point a = *this;
が何を意味しているかだね
aのクラスPoint型のオブジェクト宣言
Point a
により
クラスPoint型のオブジェクトaが作製され
クラスPoint型のオブジェクトaのメンバ変数
a.x
a.y
が生成されています
そして
クラスPoint型のオブジェクトp1のメンバ関数operator++関数
p1++
が実行されるとき
ポインタ変数thisには
クラスPoint型のオブジェクトp1のアドレスが代入されることになります
ですので
ポインタ変数thisに*がつけられた
Point a = *this;
の*thisは
クラスPoint型のオブジェクトp1をあらわすことになります
つまり
Point a = *this;
が
実行されると
クラスPoint型のオブジェクトaにクラスPoint型のオブジェクトp1が代入されることになります
すると
クラスPoint型のオブジェクトaのメンバ変数
a.x
a.y
に
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
が
代入されることになるので
クラスPoint型のオブジェクトaのメンバ変数
a.x
a.y
には
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
が
格納しているデータ
1
1
が代入されることになります
🍎そののち🍎
Point a = *this;
に続く命令文
p1.x =p1.x +1;
p1.y =p1.y +1;
の実行により
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
に格納されている数値データは
2
2
になります
そして
return a;
により
クラスPoint型のオブジェクトp1のメンバ関数operator++関数
p1++
に
戻り値として
クラスPoint型のオブジェクトaが返されます
このとき
クラスPoint型のオブジェクトaのメンバ変数
a.x
a.y
には
1
1
が代入されています
つまり
p2=p1++;
が実行されると
クラスPoint型のオブジェクトp2にクラスPoint型のオブジェクトaが代入される
p2=a;
に相当するものが実行されることになります
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
には
クラスPoint型のオブジェクトaのメンバ変数
a.x
a.y
が格納している数値データが代入されることになるので
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
には
1
1
が代入されることになります
このとき
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
に格納されている数値データは
2
2
で
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
には
1
1
が代入されています
ですので
p1.pointdisplay();
p2.pointdisplay();
が実行されると
コマンドプロンプト画面に
2
2
1
1
が表示されることになります」
マックス「また先にいわれてしまったい・・・
まさか・・・
後置演算子++のオーバーロードにポインタ変数thisを使うことを見抜かれているとは・・・」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます