クラスarray型のクラステンプレートと配列を使ってメモリにデータを格納するときの違いを考察してみましょう

マックス「


arrのint型の配列宣言


int arr[5]={ 1, 2, 3, 4, 5 };


が実行される場合と


arrのクラスarray<int, 5>型のオブジェクト宣言


array<int, 5> arr{ 1, 2, 3, 4, 5 };


が実行される場合では何が違うかを


考察してみましょう


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

👇


#include <iostream>

#include <array>


using namespace std;


int main()

{

array<int, 5> arr{ 1, 2, 3, 4, 5 };


array<int, 5> brr(arr);//👈ここです


cout << brr[0] << "\n";

cout << brr[1] << "\n";

cout << brr[2] << "\n";

cout << brr[3] << "\n";

cout << brr[4] << "\n";


return 0;

}


ビルド実行結果


1

2

3

4

5


ソーラー「


arrのarray<int, 5>型のオブジェクト宣言


array<int, 5> arr{ 1, 2, 3, 4, 5 };


が実行されると


配列変数


arr[0]

arr[1]

arr[2]

arr[3]

arr[4]


に数値データ


1

2

3

4

5


が格納されます


次に


brrのarray<int, 5>型のオブジェクト宣言


array<int, 5> brr(arr);


が実行されています



       👇ここです

array<int, 5> brr(arr);


のbrr(arr)の部分に


御注目下さい


brr(arr)が記述されていると


array<int, 5>型のオブジェクトbrr



array<int, 5>型のオブジェクトarrで初期化されることになります


つまり


配列変数


brr[0]

brr[1]

brr[2]

brr[3]

brr[4]



配列変数


arr[0]

arr[1]

arr[2]

arr[3]

arr[4]


に格納されている数値データ


1

2

3

4

5



初期化されることになります


このようなことは


配列を用いてはできません


その時のプログラムはこ・ち・ら💖

です

👇


#include <iostream>

#include <array>


using namespace std;


int main()

{

int arr[5]={ 1,2,3,4,5 };


int brr(arr);


cout << brr[0] << "\n";

cout << brr[1] << "\n";

cout << brr[2] << "\n";

cout << brr[3] << "\n";

cout << brr[4] << "\n";


return 0;

}


ビルド実行結果



エラー C2109 配列または、ポインターでない変数に添字が使われました。

エラー C2109 配列または、ポインターでない変数に添字が使われました。

エラー C2109 配列または、ポインターでない変数に添字が使われました。

エラー C2109 配列または、ポインターでない変数に添字が使われました。

エラー C2109 配列または、ポインターでない変数に添字が使われました。

エラー (アクティブ) E0142 式には pointer-to-object 型が必要です

エラー (アクティブ) E0142 式には pointer-to-object 型が必要です

エラー (アクティブ) E0142 式には pointer-to-object 型が必要です

エラー (アクティブ) E0142 式には pointer-to-object 型が必要です

エラー (アクティブ) E0142 式には pointer-to-object 型が必要です

エラー (アクティブ) E0144 型 "int *" の値を使用して型 "int" のエンティティを初期化することはできません

エラー C2440 '初期化中': 'int [5]' から 'int' に変換できません。


マックス「おおって


int brr(arr);



かなり無理な感じのbrrの配列宣言だな




ソーラー「配列brrの配列変数を


別の配列arrの配列変数に格納されているデータで


初期化するというのは


配列ではできないことですね


さらに


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

👇


#include <iostream>


#include <array>


using namespace std;


int main()

{

array<int, 5> arr;


arr = { 1,2,3,4,5 };


cout << arr[0] << "\n";

cout << arr[1] << "\n";

cout << arr[2] << "\n";

cout << arr[3] << "\n";

cout << arr[4] << "\n";


return 0;

}

ビルド実行結果


1

2

3

4

5


ソーラー「このプログラムをご覧になられてもお分かりになられますように


arrのクラスarray<int, 5>型のオブジェクト宣言では


array<int, 5> arr{ 1, 2, 3, 4, 5 };


と記述する以外にも



array<int, 5> arr;


arr = { 1,2,3,4,5 };



arrのarray<int, 5>型のオブジェクト宣言


array<int, 5> arr;



array<int, 5>型のオブジェクトarrの初期化


arr = { 1,2,3,4,5 };


をわけて記述することができます


配列を用いた場合ではこのようなことはできません


そのことを示すプログラムはこちら💖です」

👇

#include <iostream>

#include <array>


using namespace std;


int main()

{

int arr[5];


arr[5]= { 1,2,3,4,5 };


cout << arr[0] << "\n";

cout << arr[1] << "\n";

cout << arr[2] << "\n";

cout << arr[3] << "\n";

cout << arr[4] << "\n";


return 0;

}


ビルド実行結果


エラー (アクティブ) E0146 初期化子の値が多すぎます

エラー C2440 '=': 'initializer list' から 'int' に変換できません。


マックス「これはすごいんじゃないか


だって


array<int, 5> arr;


arr = { 1,2,3,4,5 };


の次に


arr= { 6,7,8,9,10 };


が実行できるってことだろう」


そのプログラムはこちらです

👇

#include <iostream>


#include <array>


using namespace std;


int main()

{

array<int, 5> arr;


arr = { 1,2,3,4,5 };


cout << arr[0] << "\n";

cout << arr[1] << "\n";

cout << arr[2] << "\n";

cout << arr[3] << "\n";

cout << arr[4] << "\n";



arr = { 6,7,8,9,10 };


cout << arr[0] << "\n";

cout << arr[1] << "\n";

cout << arr[2] << "\n";

cout << arr[3] << "\n";

cout << arr[4] << "\n";


return 0;

}


ビルド実行結果


1

2

3

4

5

6

7

8

9

10


ソーラー「さらに


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

👇


#include <iostream>

#include <array>


using namespace std;


int main()

{

array<int, 5> arr{ 1, 2, 3, 4, 5 };

array<int, 5> brr;


brr = arr;///🌞オブジェクトbrrにオブジェクトarrを代入しています


cout << brr[0] << "\n";

cout << brr[1] << "\n";

cout << brr[2] << "\n";

cout << brr[3] << "\n";

cout << brr[4] << "\n";


return 0;

}


ビルド実行結果


1

2

3

4

5




ソーラー「arrのクラスarray<int, 5>型のオブジェクト宣言


array<int, 5> arr{ 1, 2, 3, 4, 5 };


を実行して作製されたクラスarray<int, 5>型のオブジェクトarrを


brrのクラスarray<int, 5>型のオブジェクト宣言


array<int, 5> brr;


を実行して作製されたクラスarray<int, 5>型のオブジェクトbrrに


brr = arr;



代入することにより


配列変数


brr[0]

brr[1]

brr[2]

brr[3]

brr[4]



配列変数


arr[0]

arr[1]

arr[2]

arr[3]

arr[4]


に格納されている数値データ


1

2

3

4

5


が代入されています」


マックス「これもすごいな」


ソーラー「


さらに~


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

👇

#include <iostream>


#include <array>


using namespace std;


int main()

{

array<int, 5> arr{ 1, 2, 3, 4, 5 };

array<int, 5> brr{ 6,7,8,9,0 };


brr = arr;



cout << brr[0] << "\n";

cout << brr[1] << "\n";

cout << brr[2] << "\n";

cout << brr[3] << "\n";

cout << brr[4] << "\n";


return 0;

}


ビルド実行結果


1

2

3

4

5


ソーラー「brrのクラスarray<int, 5>型のオブジェクト宣言


array<int, 5> brr{ 6,7,8,8,0 };


が実行されて


配列変数


brr[0]

brr[1]

brr[2]

brr[3]

brr[4]



6

7

8

9

0


が代入されていますが


arrのクラスarray<int, 5>型のオブジェクト宣言


array<int, 5> arr{ 1, 2, 3, 4, 5 };


を実行して作製されたオブジェクトarrを


brrのクラスarray<int, 5>型のオブジェクト宣言


array<int, 5> brr{ 6,7,8,8,0 };


を実行して作製されたオブジェクトbrrに


brr = arr;



代入することにより


配列変数


brr[0]

brr[1]

brr[2]

brr[3]

brr[4]



配列変数


arr[0]

arr[1]

arr[2]

arr[3]

arr[4]


に格納されている数値データ


1

2

3

4

5


が代入されています


このようなことは


配列を用いてはできません


そのことを示すプログラムはこ・ち・ら💖


です


配列を用いた場合

👇

#include <iostream>


#include <array>


using namespace std;


int main()

{

int arr[5]={ 1,2,3,4,5 };

int brr[5]={ 6,7,8,9,0 };


brr=arr;


cout << brr[0] << "\n";

cout << brr[1] << "\n";

cout << brr[2] << "\n";

cout << brr[3] << "\n";

cout << brr[4] << "\n";


return 0;

}


ビルド実行結果



エラー C3863 配列型 'int [5]' を割り当てることはできません。

エラー (アクティブ) E0137 式は変更可能な左辺値である必要があります


ソーラー「



brr=arr;


に対してビルドエラーが表示されていますね」



マックス「配列を配列で


初期化したり


配列に配列を代入することはできなかったが


クラスarray型のクラステンプレートを用いて


オブジェクトを作製した場合は


オブジェクト



オブジェクト



初期化したり


オブジェクトにオブジェクトを代入したりすることができるわけだ


かなり配列の弱点が改良されているな」



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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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