🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
++演算子のオーバーロードを実行しオブジェクトp1に++演算子を作用させた++p1;が実行できるようにしオブジェクトp1のメンバ変数 p1.x,p1.yに格納されている値を1増やしてみます
++演算子のオーバーロードを実行しオブジェクト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のメンバ関数
が実行されるとき
ポインタ変数this
には
クラスPoint型のオブジェクト
🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞
そう
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の意味が分かった?😊
🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞 🌞
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます