🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
変数の型intのオーバーロードを行いオブジェクトaに変数の型intを作用させた(int)aが実行されるときオブジェクトaのメンバ関数 a.operator int() が実行されることになります
変数の型intのオーバーロードを行いオブジェクトaに変数の型intを作用させた(int)aが実行されるときオブジェクトaのメンバ関数 a.operator int() が実行されることになります
🌞 🌞 🌞 🌞 🌞 🌞 🌞
寄り道しちゃった😊
それではお話は元に戻ります
では
変数の型intのオーバーロードが実行されているプログラムをご覧ください
#include <iostream>
using namespace std;
class Suuti{
public:
int x;
public:
void suutidisplay();
public:
operator int();
};
void Suuti::suutidisplay() {
cout << x << "\n";
}
Suuti::operator int() {
return x;
//😊xはクラスSuutiのメンバ変数xです
}
int main() {
Suuti a;
a.x = 1;
a.suutidisplay();
int b;
b=(int)a;
cout << b << "\n";
return 0;
}
プログラムの実行結果
1
1
このプログラムでは
まず
aのクラスSuuti型のオブジェクト宣言
Suuti a;
により
クラスSuuti型のオブジェクトaのメンバ変数
a.x
クラスSuuti型のオブジェクトaのメンバ関数
a.operator int()
が生成されています
次に
クラスSuuti型のオブジェクトaのメンバ変数
a.xに
a.x = 1;
と数値データ1を代入し
a.suutidisplay();
を実行することにより
コマンドプロンプト画面に
クラスSuuti型のオブジェクトaのメンバ変数
a.xが格納している数値データ
1
を表示しています。
次に
int b;
により
変数bを生成しています
そしていよいよ
b=(int)a;
の実行ですね
まずは
クラスSuuti型のオブジェクトaに
変数の型intを作用させた
(int)aの部分をみていこうかな
実は
(int)a
が実行されるとき
クラスSuuti型のオブジェクトaのメンバ関数
💖a.operator int()💖
が実行されることになります
つまり
💖(int)a💖
は
💖a.operator int()💖
に等しいというわけです
実際に
b=(int)a;
を
b=a.operator int();
と記述してもプログラムを実行することができます
a.operator int()
が実行されるとき
operator int()のクラスSuutiのメンバ関数宣言の定義
👇
Suuti::operator int() {
return x;
}
の
🌞return x🌞
に
クラスSuuti型のオブジェクトaのメンバ変数
🌞a.x🌞
が代入された
🌞return a.x;🌞
が実行されることになります
クラスSuuti型のオブジェクトaのメンバ変数
a.x
には
1
が代入されているので
クラスSuuti型のオブジェクトaのメンバ関数
a.operator int()には
return a.x;
により
戻り値として
1が返されることになります
ところで
🍪変数の型intのオーバーロードを実行しているので🍪
🍪クラスSuutiのメンバ関数operator int()🍪
の戻り値を格納する型は
🍪自動的に🍪
🍪int型🍪
に設定されるのでした
ですので
クラスSuuti型のオブジェクトaのメンバ関数
(int)a
すなわち
a.operator int()
が実行される場合
その戻り値1を格納する型は
int型なので
1が
(int)a
イコール
a.operator int()
に
戻り値として返されることになります
ですので
b=(int)a;
イコール
b=a.operator int();
が実行されると
int型の変数bには
1
が代入されることになります。
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「結局
このプログラムでは何が行われているんだ?」
ソーラー「う・・・ん・・・・・、このプログラムでは
クラスSuuti型のオブジェクトaのメンバ変数
a.x
に格納された数値データ
1
を
クラスSuuti型のオブジェクトでない
普通のint型の変数bに格納しているんだね」
マックス「なんか 歯切れが悪いな
int型の演算子のオーバーロードを実行しなくても
クラスSuuti型のオブジェクトaのメンバ変数
a.xに格納された数値データ
1
を
クラスSuuti型のオブジェクトでない普通のint型の変数bに格納するだけなら
b=a.xで
いいんじゃないか?
int型の演算子のオーバーロードを実行する必要はないんじゃないか?
いや
もしや
int型の演算子のオーバーロードのシステム自体が必要ないんじゃないか」
ソーラー「ぐうぅ」
solarplexuss「うぅん?
b=(int)a;
が実行されたとき
必ずしも
b=a.x
が実行されるように
int型の演算子のオーバーロードの定義を設定しなくてもいいから
int型の演算子のオーバーロードのシステム自体が意味がないことはない・・・
のかな??
」
b=(int)a;
を
b=a.xで置き換えたプログラムはこちらです
👇
#include <iostream>
using namespace std;
class Suuti {
public:
int x;
public:
void suutidisplay();
public:
operator int();
};
void Suuti::suutidisplay() {
cout << x << "\n";
}
Suuti::operator int() {
return x;
}
int main() {
Suuti a;
a.x = 1;
a.suutidisplay();
int b;
b = a.x;//🌞b=(int)a;をb=a.xで置き換えました
cout << b << "\n";
return 0;
}
プログラムの実行結果
1
1
🌞 🌞 🌞 🌞 🌞 🌞 🌞
😊えへっ そうなの😊
そこは置いておいて
もし
クラスSuutiのメンバ変数宣言
int x;
のアクセス指定子が
🌞private🌞で
クラスSuutiのメンバ関数宣言
operator int();
のアクセス指定子が
publicなら
クラスSuutiのメンバ変数宣言
int x;
のアクセス指定子が
private
なので
main関数内では
クラスSuuti型のオブジェクトaのメンバ変数
🍓a.x🍓
を
直接
用いることはできません
ですから
a.x=1;
を実行して
クラスSuuti型のオブジェクトaのメンバ変数
a.x
に数値データを代入することはできません
もちろん
main関数内では
b=a.xを実行することもできません
(^。^)せっかくint型のオーバーロードをおこなっていても(^。^)
そもそも
クラスSuuti型のオブジェクトaのメンバ変数
a.x
を使うことができず
a.x
に数値データが代入できないのでは
どうしようもないの~ってなるんだ~(*´▽`*)
ですが
クラスSuutiのメンバ関数宣言
operator int();
のアクセス指定子が
publicなので
クラスSuuti型のオブジェクトaのメンバ関数
a.operator int()
を実行することはできるんだね
そう
クラスSuuti型のオブジェクトaのメンバ関数を実行することはできるのね
そこで💖
オーソドックスな解決方法が登場するの
main関数内では
オブジェクトのメンバ関数は
オブジェクトのメンバ変数に
間接的に
アクセスすることができるので
以下のように定義された
クラスSuutiのメンバ関数であるセッター関数setData
👇
Suuti::setData(int d) {
x=d;
}
を用いれば
クラスSuuti型のオブジェクトaのメンバ関数
a.setData(1);
を実行することにより
クラスSuutiのメンバ変数宣言
int x;
のアクセス指定子が
private
なことにより
クラスSuuti型のオブジェクトaのメンバ変数
a.x
に
😊直接😊
アクセスして
数値データを代入できなくても
😊間接的に😊
クラスSuuti型のオブジェクトaのメンバ変数
a.x
にアクセスし数値データ1を代入することができます
さらに
クラスSuutiのメンバ関数であるゲッター関数getData()
👇
Suuti::getData() {
return x;
}
を設定します
これで準備完了~ってわけ~
🌞 🌞 🌞 🌞 🌞 🌞 🌞
solarplexuss「ゲッター関数も設定しておくんだ」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
そう ゲッター関数は後で使うんです
ですので
あとは
a.setData(1);
b=(int)a;
イコール
b=a.operator int();
を実行することにより
int型の変数bに
クラスSuuti型のオブジェクトaのメンバ変数
a.x
が
格納している数値データ1を代入することができるようになります
つまり
b=a.x;
を行うことはできなくても
b=(int)a;
イコール
b=a.operator int();
を実行することにより
int型の変数bに
クラスSuuti型のオブジェクトaのメンバ変数
a.x
が
格納している数値データ1を代入することができるようになります
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「 セッター関数と変換関数のコラボってわけか(^_^)/」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
とはいっても
b=a.x;
に相当するものを行いたければ
クラスSuuti型のオブジェクトaのメンバ関数
b=a.getData();
//ここで登場😊ゲッター関数です
を実行した方が早いかもしれない
となると
int型のオーバーロードを行う必要はないことになる・・・にゃ??
にゃにゃ???
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「ええ〜 なあにぃぃぃ
その解説で良いのか???
int型のオーバーロードの説明
なんか•••間違ってないか」
😊仲良く続く・・・😊
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます