変数の型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型のオーバーロードの説明


なんか•••間違ってないか」





😊仲良く続く・・・😊




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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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