🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
クラステンプレートを用いることにより オブジェクトのメンバ変数に代入したい数値データに合わせてオブジェクトのメンバ変数の型を自由に変更することができます
クラステンプレートを用いることにより オブジェクトのメンバ変数に代入したい数値データに合わせてオブジェクトのメンバ変数の型を自由に変更することができます
ソーラー「では
次のようなクラスVectorがあるとします
class Vector {
public:
int x;
public:
int y;
};
この
2つのメンバ変数をもつ
クラスVectorを用いれば
main関数内で
Vecter a;
のように
aのクラスVector型のオブジェクト宣言を行い
クラスVector型のオブジェクトaのメンバ変数
a.x
a.y
に
💖整数値データ💖
を格納することができます
そのことを示すプログラムはこちらです
👇
#include <iostream>
using namespace std;
class Vector {
public:
int x;
public:
int y;
};
int main() {
Vector a;
a.x = 1;
a.y = 2;
cout << a.x << "\n";
cout << a.y << "\n";
return 0;
}
プログラムの実行結果
1
2
てんC「ソーラーさん 素晴らしく清々しいプログラムですね。」
ソーラー「へへ そうでしょう?
とてもわかりやすい
いいプログラムですね。
そして
クラスVector
の
メンバ変数宣言は
int x;
int y;
と
int型に設定されているため
クラスVector型のオブジェクトaのメンバ変数
a.x
a.y
には
整数値データのみ格納されることになります
実数値データを格納しようとしても数値データの型変換が起こり
実数値データの小数点以下の部分が切り取られた整数値データの部分だけが
クラスVector型のオブジェクトaのメンバ変数
a.x
a.y
に格納されることになります
もし
クラスVectorの定義が
class Vector {
public:
float x;//🌞int x;からfloat x;に変更しました
public:
float y;//🌞int y;からfloat y;に変更しました
};
なら
main関数内で
Vector a;
のように
aのクラスVector型のオブジェクト宣言を行い
クラスVector型のオブジェクトaのメンバ変数
a.x
a.y
に
💖実数値データ💖を格納することができます
そのことを示すプログラムはこちらです
👇
#include <iostream>
using namespace std;
class Vector {
public:
float x;
public:
float y;
};
int main() {
Vector a;
a.x = 1.11111;
a.y = 2.22222;
cout << a.x << "\n";
cout << a.y << "\n";
return 0;
}
プログラムの実行結果
1.11111
2.22222
ソーラー「ですが
1度 メンバ変数宣言の型を
int型に設定してしまうと
クラスVector型のオブジェクトを生成したとき
クラスVector型のオブジェクトのメンバ変数に格納される値は整数値データとなります
実数値データを格納することはできません
逆に
1度 メンバ変数宣言の型を
float型に設定してしまうと
クラスVector型のオブジェクトを生成したとき
クラスVector型のオブジェクトのメンバ変数に格納される値は実数値データとなります
整数値データを格納することはできません
ですが
クラスVector型のオブジェクトのメンバ変数に
整数値データを格納したいときもあれば
実数値データを格納したいときもあるんじゃないかな?」
solarplexuss「まさか
クラスVector型のオブジェクトのメンバ変数に
整数値データを格納したいときもあれば
実数値データを格納したいときもある
どちらでも好きな方を選択できるようにできるってことぉ
演算子のオーバーロードといいC++言語は
細かいところに手が届くね」
ソーラー「ふふっ
そこで
登場するのが
🌞クラステンプレート🌞
なんです
クラステンプレートとは
クラスのひな型という意味です
クラステンプレートを用いれば
クラス宣言のメンバ変数で用いられる
型を
main関数内で自由に変更することができます」
マックス「??・・・???」
ソーラー「
例えば
template<class T>
class Vector {
public:
T x;
public:
T y;
};
が
クラステンプレートの1例となります
このTの部分には本来データを格納する型が記述されるはずですが
自分でどの型を用いるかを後で自由に設定することができるように
T
となっています
この
T
を
テンプレートパラメータといいます
このT
には
自分の設定したい型を代入することができます
そのTに代入する型は
テンプレート引数とよばれます
クラス宣言の前に
template<class T>
と記述することにより
Tをテンプレートパラメータに設定することができます
class Vector {
public:
T x;
public:
T y;
};
と記述しただけでは
Tはテンプレートパラメータにならないのでご注意ください
さて
このクラステンプレート(クラスのひな型)は
どのように機能するのでしょうか?
このクラステンプレートが用いられた
👇
template<class T>
class Vector {
public:
T x;
public:
T y;
};
👆
プログラムを実行してみたいと思います
そのプログラムはこちらです
👇
#include <iostream>
using namespace std;
template<class T>
class Vector {
public:
T x;
public:
T y;
};
int main() {
Vector<int> a;///👈ここがかっこいいです😊
a.x = 1.11111;
a.y = 2.22222;
cout << a.x << "\n";
cout << a.y << "\n";
return 0;
}
プログラムの実行結果
1
2
マックス「なんだ?
Vector<int> a;
は?」
ソーラー「
main関数内で
Vector<int> a;
と
見慣れないものが実行されています
Vector<int> a;
は
aのVector<int>型のオブジェクト宣言なんです
クラステンプレートは
👇
template<class T>
class Vector {
public:
T x;
public:
T y;
};
のように設定されています
このようにクラステンプレートが設定されている場合でも
オブジェクトを
作製することができるのですが
テンプレートパラメータTの部分には
どのような型が代入されるかを指定する必要があります
そこで
例えば
aのクラスVector<int>型のオブジェクト宣言
Vector<int> a;
を実行します
<>の中にTに代入したいint型をテンプレート引数として記述することにより
クラステンプレート
👇
template<class T>
class Vector {
public:
T x;
public:
T y;
};
の
Tに
int
が代入された
class Vector {
public:
int x;
public:
int y;
};
と定義された
aのクラスVector型のオブジェクト宣言
Vector a;
が実行されることになります
こうして
生成された
クラスVector<int>型のオブジェクトaのメンバ変数
a.x
a.y
は
int型の変数なので
a.x = 1.11111;
a.y = 2.22222;
を実行しても
代入される実数値データ
1.11111
2.22222
の型変換が起こり
クラスVector<int>型のオブジェクトaのメンバ変数
a.x
a.y
には
1
2
が代入されることになります
ですので
cout << a.x << "\n";
cout << a.y << "\n";
が実行されると
コマンドプロンプト画面に
1
2
が表示されることになります
続けて
bのクラスVector<float>型のオブジェクト宣言
Vector<float> b;
を実行したとします
<>の中に
Tに代入したいfloat型を記述することにより
クラステンプレート
👇
template<class T>
class Vector {
public:
T x;
public:
T y;
};
の
Tに
float
が代入された
class Vector {
public:
float x;
public:
float y;
};
と定義された
bのクラスVector<float>型のオブジェクト宣言
Vector b;
が実行されることになります
こうして
生成された
クラスVector<float>型のオブジェクトbのメンバ変数
b.x
b.y
は
float型の変数なので
b.x = 1.11111;
b.y = 2.22222;
を実行した場合
クラスVector<float>型のオブジェクトbのメンバ変数
b.x
b.y
には
1.11111
2.22222
が代入されることになります
ですので
cout << a.x << "\n";
cout << a.y << "\n";
が実行されると
コマンドプロンプト画面に
1.11111
2.22222
が表示されることになります
そのことを示すプログラムはこちらです
👇
#include <iostream>
using namespace std;
template<class T>
class Vector {
public:
T x;
public:
T y;
};
int main() {
Vector<int> a;
a.x = 1.11111;
a.y = 2.22222;
cout << a.x << "\n";
cout << a.y << "\n";
Vector<float> b;
b.x = 1.11111;
b.y = 2.22222;
cout << b.x << "\n";
cout << b.y << "\n";
return 0;
}
ビルド実行結果
1
2
1.11111
2.22222
マックス「おおっ、すごいじゃないか
開発者やるなぁ(^。^)
クラスVector型のオブジェクトaのメンバ変数
と
クラスVector型のオブジェクトbのメンバ変数
に格納したい数値データに合わせて
クラスVector型のオブジェクトaのメンバ変数
と
クラスVector型のオブジェクトbのメンバ変数
の型を
変更できるってわけか
これはよく考えられた仕組みじゃないか😊」
ぶーにゃん「しゅ、しゅごいにゃん ジュゴンちゃん」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます