アレイにイニシャライザリストを使用できないことを承知しています。ただし、イニシャライザリストと同様の方法でポインタの配列をNULLに設定する方法を聞いたことがあります。
これがどのように行われるかはわかりません。ポインタがデフォルトでNULLに設定されていると聞いたことがありますが、これがC++標準で保証されているかどうかはわかりません。また、通常の割り当てと比較して、新しいオペレーターを介して初期化することが違いを生むかどうかもわかりません。
編集:ヘッダーファイル/コンストラクターの初期化リストでこれを行うことを意味します。コンストラクタに入れたくないし、Vectorを使いたくない。
コンストラクタ初期化子リストでポインタの配列をnullに設定するには、()
初期化子を使用できます
struct S {
int *a[100];
S() : a() {
// `a` contains null pointers
}
};
残念ながら、現在のバージョンの言語では、()
初期化子が、コンストラクタ初期化子リストの配列メンバーで使用できる唯一の初期化子です。しかし、明らかにこれはあなたがあなたの場合に必要なものです。
()
は、new[]
で割り当てられた配列に同じ影響を与えます
int **a = new int*[100]();
// `a[i]` contain null pointers
他のコンテキストでは、{}
集約初期化子を使用して同じ効果を達成できます
int *a[100] = {};
// `a` contains null pointers
0
の間に{}
またはNULL
を詰め込む必要はまったくないことに注意してください。空の{}
のペアで問題ありません。
配列からstd::vector
に切り替えて使用できます
std::vector<T*> v(SIZE);
値はNULL
sによって自動的に初期化されます。これは、推奨されるC++の方法です。
更新:C++ 11以降、もう1つの方法があります。
std::array<T*, SIZE> array = {};
これは修正されたバージョンのCスタイル配列(特に、動的割り当てを回避する)のように動作し、そのサイズを保持し、ポインターまで減衰しません。ただし、サイズはコンパイル時にわかっている必要があります。
通常、配列はデフォルトでは初期化されませんが、1つ以上の要素を明示的に初期化すると、残りの要素は自動的に0に初期化されます。0とNULL
は同等であるため、ポインタの配列を初期化できますNULL
は次のようになります:
float * foo[42] = { NULL }; // init array of pointers to NULL
これがどのように行われるかはわかりません。ポインタがデフォルトでNULLに設定されていると聞きましたが、これがC++標準で保証されているかどうかはわかりません。
C++標準では保証されていません。組み込み型(ポインタのような)は、特に設定しない限り、ガベージで埋められます。
また、通常の割り当てと比較して新しい演算子を介して初期化することで違いが生じるかどうかもわかりません。
「通常の割り当て」とはどういう意味ですか?自動変数について話している場合、これを行うことができます:
MyType * pointers[2] = {}
ポインタはNULLに初期化する必要があります。
void* p[10] = { 0 };