変数の型のオーバーロードはオブジェクトのメンバ変数に格納されている値を別の型に格納しなおして取りだすときに用いられます

続きです💖




🌞    🌞    🌞    🌞    🌞    🌞    🌞



変数の型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に代入しているのがわかりやすいんじゃない〜😊」


マックス「おお なかなか良いアイデアだ・・・」













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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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