クラス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型のオブジェクトp1🍎のメンバ関数operator++が実行されるので🍎


クラスPointのメンバ関数operator++関数の定義

👇

Point Point::operator++(int i) {


Point a;


a.x = x++;

a.y = y++;


return a;


}


🍎


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


に格納されている数値データは



等しくならないんです😊」


マックス「ぐぬぬ 先にいわれてしまった・・・」

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る