🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
変数の型intのオーバーロード(定義の追加)を実行しオブジェクトaに変数の型intを作用させるときは通常 (int)a;と記述します
変数の型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型に変換するキャスト演算子のようだな」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます