🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
クラスPoint型のオブジェクトp1に後置演算子++を作用させたp1++;を実行できるよう後置演算子++のオーバーロードを実行してみたいと思います
クラスPoint型のオブジェクトp1に後置演算子++を作用させたp1++;を実行できるよう後置演算子++のオーバーロードを実行してみたいと思います
つづきです
クラスPointのクラス宣言と
そのクラスPointのメンバ関数が
以下のように設定されているとします
👇
class Point{
public: //アクセス指定子がpublicに設定されています
int x;
int y;
public:
void pointdisplay();
};
void Point::pointdisplay() {
cout << x << "\n";
cout << y << "\n";
}
🌞 🌞 🌞 🌞 🌞 🌞 🌞
それでは
クラスPoint型のオブジェクトp1
に後置演算子++を作用させた
p1++;
が実行できるよう
後置演算子++のオーバーロードを実行してみたいと思います
後置演算子++のオーバーロードの定義内容はどのように設定するかというと・・・
p1++;
が実行されたとき
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
に格納されている数値データが
1
増えるように
そのとき
もし
別のクラスPoint型のオブジェクトp2
に
p1++
を代入する
p2=p1++:
が実行されていれば
代入演算子=の実行が後置演算子++の実行より優先されて
まず
p2=p1
が実行されて
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
に
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
の持っている数値データが代入され
そののち
p1++
が実行されて
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
の格納している数値データが
1増えるようにもしたいとおもいます
そのときの後置演算子++のオーバーロードの方法は
クラスPointのクラス宣言内に
operator++関数のクラスPointのメンバ関数宣言
Point operator++(int i);
を加えて
👇
class Point{
public: //アクセス指定子がpublicに設定されています
int x;
int y;
public:
void pointdisplay();
Point operator++(int i);//👈🌞ここです
};
👆
とし
クラスPointのメンバ関数operator++関数の定義を
Point Point::operator++(int i) {
Point a;
a.x = x++;
a.y = y++;
return a;
}
としてみます
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「operator++関数のクラスPointのメンバ関数宣言
Point operator++(int i);
と
クラスPointのメンバ関数operator++関数の定義
👇
Point Point::operator++(int i) {
Point a;
a.x = x++;
a.y = y++;
return a;
}
で
operator++関数の引数が(int i)になっているけど
これはなんなのだ?」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
後置演算子++のオーバーロードが実行されるときは
operator++関数の引数に
int型の変数宣言
int i
を設定します
int d
でも
int e
でも変数名は自由に設定してかまいません
もし
operator++関数の引数に
operator++(int i)のように
int型の変数宣言
int i
が記述されていなければ
p1++;
のように
😊オブジェクトp1に対して😊
++演算子を後置して作用させることはできず
p1++;
を実行しようとするとビルドエラーが表示されることになるので
注意してね。
後置演算子++のオーバーロードを行う際の決まりごとなの💖
では このように
後置演算子++のオーバーロードが設定された状態で
プログラムを実行してみたいと思います
そのプログラムはこちらです
👇
#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
マックス「やったな
プログラムの実行結果
1
1
2
2
1
1
か(*^。^*)
ちゃんと
ビルド実行できてるじゃないか
p2=p1++;
を実行することができたわけだ
このプログラムではなにがおこなわれているかというと
まず・・・」
int(イント)「
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;
a.x = x++;
a.y = y++;
return a;
}
の
🍎
x
y
に
p1.x
p1.y
が代入された
🍎
Point a;
a.x = p1.x++;
a.y = p1.y++;
return a;
が
実行されることになります
このとき
aのクラスPoint型のオブジェクト宣言
Point a;
により
クラスPoint型のオブジェクトaが作製され
クラスPoint型のオブジェクトaのメンバ変数
a.x
a.y
が生成されています
次に
a.x = p1.x++;
a.y = p1.y++;
の実行になりますが
まず
a.x = p1.x
a.y = p1.y
が実行されることになります
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
には
1
1
が代入されているので
クラスPoint型のオブジェクトaのメンバ変数
a.x
a.y
には
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
の持っている数値データ
1
1
が代入されることになります
次に
p1.x++;
p1.y++;
が実行されることにより
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
に格納されている数値データは
1
1
から
2
2
になります
そして
return a;
により
クラスPoint型のオブジェクトp1のメンバ関数
p1++;
が実行されたときの戻り値として
p1++に戻り値aが返されます
そして
p2=p1++;
が実行されると
p1++には戻り値としてオブジェクトaが返されているので
p2=a
が実行されることになり
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
には
クラスPoint型のオブジェクトaのメンバ変数
a.x
a.y
が代入されることになります。
(正確には
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
には
クラスPoint型のオブジェクトaのメンバ変数
a.x
a.y
が格納している数値データが代入されることになります
p2=p1++;
が実行されると
クラスPoint型のオブジェクトp1のメンバ関数
p1++;
が実行されるのですが
p1++;
の実行の終了とともに
クラスPoint型のオブジェクトaは消去されています
)
クラスPoint型のオブジェクトaのメンバ変数
a.x
a.y
には
1
1
が代入されているので
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
には
1
1
が代入されることになります
つ・ま・り⭐
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
に
1
1
が格納されている状態で
p2=p1++;
が実行されると何が起きるかというとね。
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
には
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
が持っている数値データ
1
1
が代入され
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
は
1
1
の数値データをもつことになります。
そして
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
が持っている数値データ
は
1増えて
2
2
となるんだ
となるとね💖
p2=p1++;
が実行されると
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
に格納されている数値データは
2
2
で
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
に格納されている数値データは
1
1
となるんです
p2=p1++;
が実行されると
クラスPoint型のオブジェクトp1のメンバ変数
p1.x
p1.y
に格納されている数値データ
と
クラスPoint型のオブジェクトp2のメンバ変数
p2.x
p2.y
に格納されている数値データは
等しくならないんです😊」
マックス「ぐぬぬ 先にいわれてしまった・・・」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます