変数の型intのオーバーロード(定義の追加)を実行しオブジェクトaに変数の型intを作用させるときは通常 (int)a;と記述します

つ・づ・き(*´▽`*)/



オブジェクトに変数の型を作用させることができるよう


変数の型のオーバーロードを実行するには


クラス宣言内で


クラスのメンバ関数である変換関数のメンバ関数宣言


をおこない


そののち


クラスのメンバ関数である変換関数


の定義を行います


クラスのメンバ関数である変換関数のメンバ関数宣言は


operator オーバーロードする変数の型名();


と記述します


そして


変換関数

👇

operator オーバーロードする変数の型名()


の定義は



operator オーバーロードする変数の型名(){


オブジェクトに変数の型を作用させたとき実行したい命令文


}


のように記述します


{}の中には


オブジェクトに変数の型を作用させたとき実行したい命令文


を記述します


それでは


もともと実行できない


オブジェクトaにintを作用させた


int a;


が実行できるよう


変数の型intのオーバーロードを実行してみたいと思います。



ただし



オブジェクトに変数の型を作用させる場合は


変数の型を()で囲むというルールがあります


ですので


オブジェクトaにintを作用させる場合は


int a;


ではなく


(int) a;


と記述することになります



変数の型intのオーバーロードを実行するには


クラス宣言内で


クラスのメンバ関数である変換関数operator int()のメンバ関数宣言


をおこない


そののち


クラスのメンバ関数である変換関数operator int()


の定義を行います


それでは


変数の型intのオーバーロードが実行されている


次のプログラムをご覧ください


次のプログラムでは


先ほど登場した


1つの数値データを


コマンドプロンプト画面に表示する機能を持つ


クラスSuutiをもちいています



変数の型


int


のオーバーロードを実行し


クラスSuuti型のオブジェクトa



変数の型


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;


}


int main() {


Suuti a;


a.x = 1;


a.suutidisplay();


int b = a;


cout << b << "\n";


return 0;

}


ビルド実行結果


1

1


ソーラー「


Suutiのクラス宣言内の

👇

class Suuti{


public:

int x;


public:


void suutidisplay();


public:


operator int();


};


👆


operator int();



変換関数operator int()のクラスSuutiのメンバ関数宣言で


Suuti::operator int() {


return x;


}



クラスSuutiのメンバ関数である変換関数operator int()の定義みたいだね


それにしても


クラスSuutiのメンバ関数である変換関数operator int()の定義

👇

Suuti::operator int() {


return x;


}


定義内容は return x ・・・???


この return x;



いったい何を意味しているのかな?」


マックス「そもそも


main関数内で


オブジェクトa



int型の変数bに


int b=a;


と代入している・・・


こんなことが可能なのか?


本気でファンタジーじゃないかい


そもそも


このプログラム 何が実行されているか



      まったくわからんぞ


・・・ 


そう・・・いや


変数の型intがここにいるじゃないか?


int(イント)よ? 


このプログラムでは何が実行されているんだ?」



int(イント)「・・・にゃあ」


int(イント)はネコに擬態している


マックス「猫しかいない・・・?」




🌞    🌞    🌞    🌞    🌞    🌞    🌞



このプログラムでは


まず


aのクラスSuuti型のオブジェクト宣言


Suuti a;


により


クラスSuuti型のオブジェクトaが生成されています


次に


クラスSuuti型のオブジェクトaのメンバ変数


a.xに


a.x = 1;


と数値データ1を代入し


a.suutidisplay();


を実行することにより


コマンドプロンプト画面に


クラスSuuti型のオブジェクトaのメンバ変数


a.xが格納している値


1


を表示しています。


ここまではいいかな?


🌞    🌞    🌞    🌞    🌞    🌞    🌞



マックス「そうなのだ


ここまでは


簡単なのだ


問題は・・・


このあとの


int b=a;


だ           」



🌞    🌞    🌞    🌞    🌞    🌞    🌞


int b=a;


では


まず


int bにより


int型の変数b


が生成されています


そして


通常では実行できない


int型の変数bに


int b=a;



クラスSuuti型のオブジェクトaが代入されています。


このようなことが可能なのは


int型のオーバーロードが実行されているからなんだけど


なぜ


int型のオーバーロードが実行されていると


int型の変数bに


クラスSuuti型のオブジェクトaを代入することができるのかわかる?


はい!😊(´▽`*)😊 そこの人!」


🌞    🌞    🌞    🌞    🌞    🌞    🌞



ソーラー「はい😊 まったくわかりません😊」



🌞    🌞    🌞    🌞    🌞    🌞    🌞


いい解答です


ではそこの・・・


マックスさん


🌞    🌞    🌞    🌞    🌞    🌞    🌞



マックス「int b=a;



int bは


bのint型の変数宣言でぇ・・・


そのint型の変数bに


クラスSuuti型のオブジェクトaが代入される・・・


なんで そんなことができる・・・


まったくぅぅぅぅぅ  わぁおんわん🐕」


ソーラー「ああっ 犬に取りつかれてる・・・


これがファンタジー


    クラスのメンバ関数である変換関数の


の力なんだ・・・」



🌞    🌞    🌞    🌞    🌞    🌞    🌞


int b=a;


をみただけでは


わかりにくいのだけど


実は


この命令文にはかくれているものがあるんだよ


🌞    🌞    🌞    🌞    🌞    🌞    🌞



ソーラー「かくれているもの・・・?」



わお、わおおん


何かの遠吠えが聞こえています・・・



int(イント)「う~ん かくれているもの・・・」



🌞    🌞    🌞    🌞    🌞    🌞    🌞


実は


int b=a;



int b=(int)a;



(int)


省略されています



つまり


(int)aでは


クラスSuuti型のオブジェクトaに変数の型intが作用しているんです


クラスSuuti型のオブジェクトaに変数の型intを作用させるときは


このように


intを()で囲みます


int b=(int)a;


int b;

b=(int)a;


と記述することもできます


🌞    🌞    🌞    🌞    🌞    🌞    🌞



マックス「通常


クラスSuuti型のオブジェクトaに変数の型intを作用させるときは


(int)a;


と記述するわけだ」


ソーラー「それが


int型の変数bに


(int)aを


代入するときは


int b=(int)a;



int b=a;


のように


(int)を省略できるのか・・・


なんでかな?」


マックス「


int b=(int)a;


か・・


まるで(int)は


()で囲っているあたり


クラスSuuti型のオブジェクトaを格納するクラスSuuti型を


int型に変換するキャスト演算子のようだな」


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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