C ++配列の初期化


80

配列をすべて0に初期化するこの形式です

char myarray[ARRAY_SIZE] = {0} すべてのコンパイラでサポートされていますか?、

もしそうなら、他のタイプと同様の構文はありますか?例えば

bool myBoolArray[ARRAY_SIZE] = {false} 

良いお金falseはと同じだと思います0(そうでなければif(false)falseと評価されません)ので、あなたが持っているものはおそらく99%のコンパイラで動作するでしょう。標準を引用するまで、他の1%については確信が持てません。
クリス・ルッツ

Cでは、int a[10] = { 1, 2, 3 };が、に設定さa[3]..a[9]れることを知ってい0ます(「静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます」)。これはC ++にも当てはまりますか?
Alok Singhal

5
はい、そうです。それはCのために当てはまらなかった場合、その後++ C ++でもリモートでC.との下位互換性はないだろう
クリス・ルッツ

2
falseはと同じではありません0{0}、0ではに変換されます。false(C ++の場合)では{}、変換についても気にする必要はありません。falseまたは0、nullポインタ、またはその他の型に依存するデフォルトに初期化されます。
Johannes Schaub-litb 2009

回答:


139

はい、この形式の初期化はすべてのC ++コンパイラでサポートされています。これはC ++言語の一部です。実際、それはC言語からC ++にもたらされたイディオムです。C言語で= { 0 }は、慣用的なユニバーサルゼロ初期化子です。これは、C ++でもほとんど当てはまります。

このイニシャライザーはユニバーサルであるため、bool配列の場合、実際には別の「構文」は必要ありません。タイプの0初期化子boolとしても機能するため、

bool myBoolArray[ARRAY_SIZE] = { 0 };

配列全体をfalse。で初期化することが保証されています。と同様

char* myPtrArray[ARRAY_SIZE] = { 0 };

タイプのnullポインタで配列全体を初期化することが保証されていますchar *

読みやすさが向上すると思われる場合は、必ず使用できます。

bool myBoolArray[ARRAY_SIZE] = { false };
char* myPtrArray[ARRAY_SIZE] = { nullptr };

でも要点は = { 0 }バリアントがまったく同じ結果をもたらすということです。

ただし、C ++では= { 0 }、たとえば列挙型など、整数で初期化できないすべての型で機能するとは限りません。0。ただし、C ++は短い形式をサポートしています

T myArray[ARRAY_SIZE] = {};

つまり、の空のペアだけです{}。これにより、任意のタイプの配列がデフォルトで初期化されます(要素がデフォルトの初期化を許可していると仮定)。つまり、基本(スカラー)タイプの場合、配列全体が適切にゼロ初期化されます。


8
およびC ++ 0xの中であなたはこのような何か初期化することができるようになります
JKを。

4
私のコンパイラ(qtcreator 2.4.1-qtバージョン4.8.0)ではbool myBoolArray[ARRAY_SIZE] = { false };、配列を書き込むとすべてfalseに初期化されますが、書き込むbool myBoolArray[ARRAY_SIZE] = { true };と最初の要素のみがtrueに設定され、他のすべてはfalseに設定されます。説明はありますか?
新人コーダー2014年

@rookie coder:正確には何の説明ですか?何が起こると思いますか?C ++では、配列を部分的に初期化するboolと、残りはゼロで初期化されます。仕方ないよ。
AnT 2014年

1
@AndreyT結構ですが、この動作は少なくとも直感に反していると思います。のようbool myBoolArray[ARRAY_SIZE];に初期化しない場合、配列には当然ランダムな値が含まれているため、初期化によって異なる値を含む配列が返されるとは思っていませんでした。それで全部です。
新人コーダー2014

1
@AndreyT:確かに、でも雪崩が最初の要素と違うとは思ってもみませんでした;-)とにかく、情報をありがとう!
新人コーダー2014

18

'='はC ++ 11ユニバーサル初期化構文ではオプションであり、一般的に次のように記述する方が適切と見なされていることに注意してください。

char myarray[ARRAY_SIZE] {0}

0

はい、動作するはずであり、他のデータ型にも適用できると思います。

ただし、クラス配列の場合、初期化子リストの項目が配列の要素よりも少ない場合は、残りの要素にデフォルトのコンストラクターが使用されます。クラスにデフォルトのコンストラクターが定義されていない場合、初期化子リストは完全である必要があります。つまり、配列内の要素ごとに1つの初期化子が存在する必要があります。


-1

これらのタイプの方法で、C ++で配列を宣言できます。配列のサイズがわかっている場合は、次の配列を宣言する必要があります。整数:int myArray[array_size]; ダブル:double myArray[array_size]; 文字と文字列:文字と文字列char myStringArray[array_size]; の違いは次のとおりです。

char myCharArray[6]={'a','b','c','d','e','f'};
char myStringArray[6]="abcdef";

配列のサイズがわからない場合は、次のように配列を空白のままにする必要があります。

整数: int myArray[array_size];

ダブル: double myArray[array_size];

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.