🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
変数の型のオーバーロードはオブジェクトのメンバ変数に格納されている値を別の型に格納しなおして取りだすときに用いられます
変数の型のオーバーロードはオブジェクトのメンバ変数に格納されている値を別の型に格納しなおして取りだすときに用いられます
続きです💖
🌞 🌞 🌞 🌞 🌞 🌞 🌞
変数の型intのオーバーロードが実行されているプログラムをご覧ください
#include <iostream>
using namespace std;
class Suuti {
public:
float 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.11111;
a.suutidisplay();
int b;
b=(int)a;
cout << b << "\n";
return 0;
}
プログラムの実行結果
1.11111
1
このプログラムでは
まず
aのSuuti型のオブジェクト宣言
Suuti a;
により
クラスSuuti型のオブジェクトaのメンバ変数
a.x
クラスSuuti型のオブジェクトaのメンバ関数
a.operator int()
が生成されています
次に
クラスSuuti型のオブジェクトaのメンバ変数
a.xに
a.x = 1.11111;
と数値1.11111を代入し
a.suutidisplay();
を実行することにより
コマンドプロンプト画面に
クラスSuuti型のオブジェクトaのメンバ変数
a.xが格納している値
1.11111
を表示しています。
次に
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()
が実行されるとき
クラスSuutiのメンバ関数宣言の定義
👇
Suuti::operator int() {
return x;
}
の
return x
に
クラスSuuti型のオブジェクトaのメンバ変数
a.x
が代入された
return a.x;
が実行されることになります
クラスSuuti型のオブジェクトaのメンバ変数
a.x
には
1.11111
が代入されているので
クラスSuuti型のオブジェクトaのメンバ関数
a.operator int()には
return a.x;
により
戻り値として
1.11111が返されることになります
operator int()関数を実行する場合
その戻り値1.11111を格納する型は
int型なので
1.11111の小数点以下が切り捨てられた
1が
a.operator int()
イコール
(int)a
に
返されることになります
ですので
b=a.operator int();
が実行されると
変数bには
1
が代入されることになります。
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「結局
このプログラムでは何が行われているんだ?」
ソーラー「クラスSuuti型のオブジェクトaのメンバ変数に格納された数値
1.11111
を
1
に
変換して
クラスSuuti型のオブジェクトでない普通のint型の変数bに格納しているんだね
つまり
クラスSuuti型のオブジェクトaのメンバ変数a.xに格納された数値
1.11111
を
int型の整数
1
に変更するために
変数の型intのオーバーロードが行われているんだよ
クラスSuuti型のオブジェクトaのメンバ変数a.xに格納された実数値
1.11111
の整数部分
1
だけを取り出したい時に
b=(int)a;
を実行すれば良いってわけだね」
マックス「?
それでも
やはり
b=a.x;
を
実行した方が早くないか
クラスSuuti型のオブジェクトaのメンバ変数a.xに実数値
1.11111
が格納されていても
int型の変数bにa.xを代入すれば
1.11111
が
1に変換されて
int型の変数bに代入されることになるからな
って
自分で突っ込んでしまったが
変数の型intのオーバーロードをする意味がない・・・のか?」
solarplexuss「ただ
b=a.x;
を実行するよりも
b=(int)a;
を
実行した方が
クラスSuuti型のオブジェクトaのメンバ変数a.xに格納された実数値
1.11111
の整数部分
1
だけを取り出して
int型の変数bに代入しているのがわかりやすいんじゃない〜😊」
マックス「おお なかなか良いアイデアだ・・・」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます