🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
float=1.11111;を実行した後vector<float>型のオブジェクトaのメンバ関数a.push_back(x)を実行すると変数xとは別のメモリに数値データ1.11111が格納されます
float=1.11111;を実行した後vector<float>型のオブジェクトaのメンバ関数a.push_back(x)を実行すると変数xとは別のメモリに数値データ1.11111が格納されます
ソーラー「先ほどの
a.push_back(x);が用いられた
プログラムをご覧ください
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> a;
int x;
x = 1;
cout<<x<<"\n";
cout<<&x<<"\n";
a.push_back(x);
x = 2;
cout<<x<<"\n";
cout<<&x<<"\n";
a.push_back(x);
x = 3;
cout<<x<<"\n";
cout<<&x<<"\n";
a.push_back(x);
return 0;
}
プログラムの実行結果
1
00FFFA60
2
00FFFA60
3
00FFFA60
このプログラムが実行されると
連続したメモリに
数値データ1
数値データ2
数値データ3
が格納されることになりましたね
ところで
連続したメモリに
数値データ1.11111
数値データ2.22222
数値データ3.33333
を
格納したい場合はどのようなプログラムを実行したらよいと思われますか?」
てんC「
そうですね
vector<int> a;
の代わりに
vector<float> a;
をもちいたならば
連続したメモリに
数値データ1.11111
数値データ2.22222
数値データ3.33333
を
格納できるのではないですか?
そのプログラムはこちらです
👇
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<float> a;//🌞ここです aのvector<float>型のオブジェクト宣言が実行されています
float x;
x = 1.11111;
cout<<x<<"\n";
cout<<&x<<"\n";
a.push_back(x);
x = 2.22222;
cout<<x<<"\n";
cout<<&x<<"\n";
a.push_back(x);
x = 3.33333;
cout<<x<<"\n";
cout<<&x<<"\n";
a.push_back(x);
return 0;
}
プログラムの追加と削除実行結果
1.11111
003AF7F4
2.22222
003AF7F4
3.33333
003AF7F4
てんC「このプログラムでは
まず
aのvector<float> 型のオブジェクト宣言
vector<float> a;
が実行されることにより
クラスvector<float> 型のオブジェクトaが生成されています
😊クラスvector<float> 型のオブジェクトaが生成されると😊
😊クラスvector<float> 型のオブジェクトaのメンバ関数😊
😊a.push_back(x)😊
を使用することができるようになります
次に
x = 1.11111;
により
xに1.11111が代入されています
そして
cout<<x<<"\n";
cout<<&x<<"\n";
が実行されることにより
プログラムの実行結果に
xに格納されている数値データ1.11111
と
xのアドレス
003AF7F4
が表示されています
a.push_back(x);
が実行されると
xに格納されている数値データ1.11111が
変数xのアドレスのメモリとは異なる
ある別のアドレスのメモリにも格納されることになります
このとき
vector<T>型のクラステンプレートのテンプレート引数
T
に
floatを代入して
aのvector<float>型のオブジェクト宣言
vector<float> a;
を実行したので
xに格納されている数値データ1.11111
は
float型の形式でメモリに格納されることになります
もし
T
に
intを代入して
aのvector<int>型のオブジェクト宣言
vector<int> a;
を実行した場合は
xに格納されている数値データ1.11111
は
int型の形式でメモリに格納されることになります(そのことは文末で解説されます)」
てんC「
次に
x =2.22222;
により
xに2.22222が代入されています
そして
cout<<x<<"\n";
cout<<&x<<"\n";
が実行されることにより
プログラムの実行結果に
xに格納されている数値2.22222
と
そのときの
xのアドレス
003AF7F4
が表示されています
ここでの注目ポイントも
xに1.11111を格納したときのアドレス
と
xに2.22222を格納したときのアドレス
は同じ
003AF7F4
となっている点です
つまり
変数xに格納されている数値1.11111は
数値2.22222によって上書きされています
a.push_back(x);
が実行されると
xに格納されている数値データ2.22222が
ある別のアドレスのメモリにもfloat型の型式で格納されることになります」
マックス「
数値データ1.11111
につづいて
数値データ2.22222
も
どこかのメモリに格納されることになるのか」
ソーラー「そうなんです
このとき
数値データ1.11111
を格納しているメモリと
数値データ2.22222
を格納しているメモリは別々のメモリです
次に
x =3.33333;
により
xに3.33333が代入されています
そして
cout<<x<<"\n";
cout<<&x<<"\n";
が実行されることにより
プログラムの実行結果に
xに格納されている数値3.33333
と
そのときの
xのアドレス
003AF7F4
が表示されています
ここでの注目ポイントは
xに1.11111を格納したときのアドレス
と
xに2.22222を格納したときのアドレス
と
xに3.33333を格納したときのアドレス
は同じ
003AF7F4
となっている点です
つまり
変数xに格納されている数値1.11111は
数値2.22222によって上書きされています
変数xに格納されている数値2.22222は
数値3.33333によって上書きされています
a.push_back(x);
が実行されると
xに格納されている数値データ3.33333が
ある別のアドレスのメモリにfloat型の形式で格納されることになります」
マックス「
数値データ1
数値データ2
につづいて
数値データ3
も
どこかのメモリにfloat型の形式で格納されることになるのか」
ソーラー「そうなんです
このとき
数値データ1.11111
を格納しているメモリと
数値データ2.22222
を格納しているメモリと
数値データ3.33333
を格納しているメモリは別々のメモリです
そして
このとき
数値データ1.11111
を格納しているメモリと
数値データ2.22222
を格納しているメモリと
数値データ3.33333
を格納しているメモリは
連続して並んでいるメモリになっているんです
たとえば
数値データ1.11111
を格納しているメモリが
00FFFA10
なら
数値データ2.22222
を格納しているメモリは
00FFFA14
数値データ3.33333
を格納しているメモリは
00FFFA18
になります
float型は32ビット=4バイトであり
数値データ1.11111などの実数値がfloat型の形式でメモリに格納されると4バイト分のメモリにわたって格納されることになります
ですので
この場合は
数値データ1.11111は
アドレス00FFFA10から00FFFA13の4バイト分のメモリにわたって格納されています
ですので
数値データ2.22222は
アドレス00FFFA14から00FFFA17の4バイト分のメモリにわたって格納されることになります
数値データ2.22222は
アドレス00FFFA11のメモリから格納されているわけではないのですね
ヘッダファイル<vector>は
vector<T> 型のクラステンプレートを管理していて
Tにintを代入して
aの vector<int> 型のオブジェクト宣言
vector<int> a;
を実行したり
<>の中にfloatを記述して
aの vector<float> 型のオブジェクト宣言
vector<float> a;
を実行することもできるというわけですね」
🌞 🌞 🌞
vector<T>型のクラステンプレートのテンプレート引数
T
に
floatを代入して
aのvector<float>型のオブジェクト宣言
vector<float> a;
を実行し
x = 1.11111;
を実行して
xに数値データ1.11111を代入し
vector<float>型のオブジェクトaのメンバ関数
a.push_back(x)
を実行した場合は
xに格納されている数値データ1.11111
は
float型の形式でメモリに格納されることになります
もし
T
に
intを代入して
aのvector<int>型のオブジェクト宣言
vector<int> a;
を実行し
x = 1.11111;
を実行して
xに数値データ1.11111を代入し
vector<int>型のオブジェクトaのメンバ関数
a.push_back(x)
を実行した場合は
xに格納されている数値データ1.11111
は
int型の形式でメモリに格納されることになります
そのことを示すプログラムはこちらです
👇
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> a;//🌞ここです aのvector<int>型のオブジェクト宣言が実行されています
float x;
x = 1.11111;
cout << x << "\n";
cout << &x << "\n";
a.push_back(x);
x = 2.22222;
cout << x << "\n";
cout << &x << "\n";
a.push_back(x);
x = 3.33333;
cout << x << "\n";
cout << &x << "\n";
a.push_back(x);
return 0;
}
プログラムの実行結果
1.11111
003AF7F4
2.22222
003AF7F4
3.33333
003AF7F4
同時に表示される
👇
警告 C4244 '引数': 'float' から 'const int' への変換です。データが失われる可能性があります
警告 C4244 '引数': 'float' から 'const int' への変換です。データが失われる可能性があります。
警告 C4244 '引数': 'float' から 'const int' への変換です。データが失われる可能性があります
警告 C4305 '=': 'double' から 'float' へ切り詰めます。
警告 C4305 '=': 'double' から 'float' へ切り詰めます。
警告 C4305 '=': 'double' から 'float' へ切り詰めます。
👆
に御注目下さい
警告 C4244 '引数': 'float' から 'const int' への変換です。データが失われる可能性があります
が表示されていますね
このことは
x = 1.11111;
a.push_back(x);
x = 2.22222;
a.push_back(x);
x =3.33333;
a.push_back(x);
の実行により
xに格納されている実数値データ
1.11111
2.22222
3.33333
は
int型の形式でメモリに格納されることになる
つまり
1
2
3
として
他のメモリに格納されることになる
ということを示しています」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます