++演算子のオーバーロードを実行しオブジェクトp1に++演算子を作用させた++p1;が実行できるようにしオブジェクトp1のメンバ変数 p1.x,p1.yに格納されている値を1増やしてみます

それでは 元気はつらつ!!


レッツ ファンタジア🌞


クラスPointのクラス宣言と


そのクラスPointのメンバ関数pointdisplay()の定義が


以下のように設定されているとします

👇


class Point{


public: //アクセス指定子がpublicに設定されています


int x;

int y;


public:


void pointdisplay();


};


void Point::pointdisplay() {


cout << x << "\n";

cout << y << "\n";


}

👆

このクラスPointのクラス宣言に


さらに


operator++関数の


クラスPointのメンバ関数宣言を追加して


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


を設定し


普通は実行できない


クラスPoint型のオブジェクトp1に++演算子を作用させた


++p1;


を実行して


クラスPoint型のオブジェクトp1のメンバ変数


           💖p1.x💖

           💖p1.y💖


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


1増やすことができるように


++演算子のオーバーロードを実行してみた~いと💖


おもったの


そのために


ポインタ変数thisについて学んでき・た・の・ね。


🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞



マックス「そうなのか?



そういや


普通は実行できない


クラスPoint型のオブジェクトp1に++演算子を作用させた


++p1;


を実行して


クラスPoint型のオブジェクトp1のメンバ変数


           💖p1.x💖

           💖p1.y💖


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


1増やすことができるように


++演算子のオーバーロードを実行するのが


          目的だった・・・


            が


いつのまにやらポインタ変数thisの解説コーナーになっていた



目的を完全にわすれていたな・・・」



ソーラー「ほんとだ」



🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞



   きゃは( ̄∇ ̄)ははは あははっはは


それでは早速


普通は実行できない


クラスPoint型のオブジェクトp1に++演算子を作用させた


++p1;


を実行して


クラスPoint型のオブジェクトp1のメンバ変数


           💖p1.x💖

           💖p1.y💖


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


1増やすことができるように


新たに


クラスPointのクラス宣言に


operator++関数の


クラスPointのメンバ関数宣言を追加し


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


を設定してみようよ



🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞




マックス「なんか 楽しそうだな」





🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞


       

      お天気もいいしウキウキしてて

  


それでは


クラスPointのクラス宣言に


新たに


operator++関数の


クラスPointのメンバ関数宣言を追加し


そのクラスPointのメンバ関数であるoperator++関数の定義を


設定してみます


👇以下のようになります


class Point{


public: //アクセス指定子がpublicに設定されています


int x;

int y;


public:


void pointdisplay();


public:


Point operator++();


};


void Point::pointdisplay() {


cout << x << "\n";

cout << y << "\n";


}


Point Point::operator++() {


x=x+1;

y=y+1;


return *this;

}


🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞



マックス「


Point operator++();



Point型のoperator++()関数の


クラスPointのメンバ関数宣言なのはなんとなくわかるわかる


だが


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


Point Point::operator++() {


x=x+1;

y=y+1;


return *this;

}



このreturn *this;は何のためにあるんだ


意味が分からないな・・・」


🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞


とりあえず


return *this;


の意味は


新たに設定された


このクラスPointのメンバ関数operator++()


を用いて


普通は実行できない


クラスPoint型のオブジェクトp1に++演算子を作用させた


++p1;


を実行し


クラスPoint型のオブジェクト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++();


};


void Point::pointdisplay() {


cout << x << "\n";

cout << y << "\n";


}



Point Point::operator++() {


x = x + 1;

y = y + 1;


return *this;

}



int main() {


Point p1;


p1.x = 1;

p1.y = 1;


p1.pointdisplay();


++p1;

p1.pointdisplay();

return 0;

}


プログラムの実行結果


1

1

2

2


🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞



ソーラー「


クラスPoint型のオブジェクト1のメンバ変数


p1.x

p1.y


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


1

1


から


++p1;


の実行により


2

2


に変化しているのが


プログラムの実行結果


1

1

2

2


をみても分かるね」



🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞


このプログラムでは


p1のクラスPoint型のオブジェクト宣言


Point p1;


によりクラスPoint型のオブジェクトp1が生成され


クラスPoint型のオブジェクトp1のメンバ変数


p1.x

p1.y



p1.x = 1;

p1.y = 1;


により


数値データ


1

1



代入されています


そして~


次は


クラスPoint型のオブジェクトp1に++演算子を


作用させた


++p1;


の実行です


🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞



ソーラー「


++p1;


が実行されると


クラスPoint型のオブジェクトp1のメンバ関数


p1.operator++();


が実行されるのかな」




🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞



ソーラーさん 絶好調だね


そう


++p1;


が実行されると


クラスPoint型のオブジェクトp1のメンバ関数


p1.operator++();


が実行されることになります


実際に


++p1;



p1.operator++();


にかきかえても


プログラムは実行できます


そのプログラムはこちらです

👇

#include <iostream>


using namespace std;


class Point{


public: //アクセス指定子がpublicに設定されています


int x;

int y;


public:


void pointdisplay();


public:


Point operator++();


};


void Point::pointdisplay() {


cout << x << "\n";

cout << y << "\n";


}



Point Point::operator++() {


x = x + 1;

y = y + 1;


return *this;

}



int main() {


Point p1;


p1.x = 1;

p1.y = 1;


p1.pointdisplay();


p1.operator++();

//🌞++p1;の代わりにp1.operator++();を記述しました

p1.pointdisplay();

return 0;

}


プログラムの実行結果


1

1

2

2



クラスPoint型のオブジェクトp1のメンバ関数


p1.operator++();


が実行されるとき


クラスPointのメンバ関数operator++()


の定義


Point Point::operator++() {


x = x + 1;

y = y + 1;


return *this;

}




xにp1.x

yにp1.y


が代入された


p1.x = p1.x + 1;

p1.y = p1.y + 1;


return *this;


が実行されることになります


🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞



マックス「


p1.x = p1.x + 1;

p1.y = p1.y + 1;


が実行されると


p1.x

p1.y


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


1

1

から

2

2

に変化しているというわけだ


あとは


return *this;


が実行されると何がおきるのか


ということだが


確か


このthisはクラスのメンバ関数の定義内でのみ


用いることができる


ポインタ変数thisのことなんだろう」



ソーラー「


そして


p1++;


すなわち


クラスPoint型のオブジェクトp1のメンバ関数


p1💖💖.operator++();


が実行されるとき


ポインタ変数this


には


クラスPoint型のオブジェクトp1💖💖のアドレスが代入されるんだったよね」




🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞


そう


p1++;


すなわち


クラスPoint型のオブジェクトp1のメンバ関数


p1.operator++();


が実行されるとき


ポインタ変数this


には


クラスPoint型のオブジェクトp1のアドレス&p1が代入されます


すると


ポインタ変数thisに*(アスタリスク)


を作用させた


*this



クラスPoint型のオブジェクトp1のアドレス&p1のメモリにアクセスし


クラスPoint型のオブジェクトp1そのものをあらわすことになります



🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞



ソーラー「ということは


*this



クラスPoint型のオブジェクトp1そのもの


をあらわすのなら


return *this;


が実行されると


++p1


すなわち


クラスPoint型のオブジェクトp1のメンバ関数


p1.operator++()


の戻り値として


++p1


すなわち


クラスPoint型のオブジェクトp1のメンバ関数


p1.operator++()



クラスPoint型のオブジェクトp1が


戻されることになるのかな?」



🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞


   そうなの(*´▽`*)


++p1;


が実行されたとき


++p1


すなわち


クラスPoint型のオブジェクトp1のメンバ関数


p1.operator++()



戻り値として


クラスPoint型のオブジェクトp1が


返されるよう


operator++()関数のクラスPointのメンバ関数宣言


Point operator++();

👆ここ


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


Point Point::operator++() {

👆ここ

x = x + 1;

y = y + 1;


return *this;

}



クラスPointのメンバ関数operator++()の戻り値を格納する型が


Pointに設定されているんだよ



ですので


++p1;


すなわち


クラスPoint型のオブジェクトp1のメンバ関数


p1.operator++();


が実行されると


++p1


すなわち


クラスPoint型のオブジェクトp1のメンバ関数


p1.operator++()



戻り値として


クラスPoint型のオブジェクトp1が返されるので


++p1


すなわち


p1.operator++()



クラスPoint型のオブジェクトp1を表すことになります



このとき


クラスPoint型のオブジェクトp1のメンバ変数


p1.x

p1.y


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


p1.x = p1.x + 1;

p1.y = p1.y + 1;


が実行されているので


2

2

となっています


ですので


p2のクラスPoint型のオブジェクト宣言


Point p2;


を行っておいて


p2=++p1;


のように


クラスPoint型のオブジェクトp2に


++p1


を代入する命令文が記述されていると


クラスPoint型のオブジェクトp2のメンバ変数


p2.x

p2.y


には


数値データ


2

2


が代入されることになります


そのプログラムはこちらです

👇

#include <iostream>


using namespace std;


class Point{


public: //アクセス指定子がpublicに設定されています


int x;

int y;


public:


void pointdisplay();


public:


Point operator++();


};


void Point::pointdisplay() {


cout << x << "\n";

cout << y << "\n";


}



Point Point::operator++() {


x = x + 1;

y = y + 1;


return *this;

}



int main() {


Point p1;


p1.x = 1;

p1.y = 1;


p1.pointdisplay();


Point p2;


p2=++p1;


p2.pointdisplay();


return 0;

}


プログラムの実行結果


1

1

2

2


これで


return *thisの意味が分かった?😊


🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞   🌞

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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