Je suis conscient que vous ne pouvez pas utiliser une liste d'initialisation pour un tableau. Cependant, j'ai entendu parler de façons de définir un tableau de pointeurs sur NULL d'une manière similaire à une liste d'initialisation.
Je ne sais pas comment cela se fait. J'ai entendu qu'un pointeur est défini sur NULL par défaut, bien que je ne sais pas si cela est garanti/dans la norme C++. Je ne sais pas non plus si l'initialisation via le nouvel opérateur par rapport à l'allocation normale peut également faire la différence.
Edit: Je veux faire cela dans une liste d'initialisation de fichier d'en-tête/constructeur. Je ne veux pas le mettre dans le constructeur, et je ne veux pas utiliser de vecteur.
Afin de définir un tableau de pointeurs sur null dans la liste d'initialisation du constructeur, vous pouvez utiliser le ()
initialiseur
struct S {
int *a[100];
S() : a() {
// `a` contains null pointers
}
};
Malheureusement, dans la version actuelle de la langue, le ()
initializer est le seul initialiseur que vous pouvez utiliser avec un membre du tableau dans la liste d'initialisation du constructeur. Mais apparemment, c'est ce dont vous avez besoin dans votre cas.
Le ()
a le même effet sur les tableaux alloués avec new[]
int **a = new int*[100]();
// `a[i]` contain null pointers
Dans d'autres contextes, vous pouvez utiliser le {}
initialiseur d'agrégat pour obtenir le même effet
int *a[100] = {};
// `a` contains null pointers
Notez qu'il n'est absolument pas nécessaire de presser un 0
ou NULL
entre les {}
. La paire vide de {}
fera très bien l'affaire.
Vous pouvez passer du tableau à std::vector
et utilise
std::vector<T*> v(SIZE);
Les valeurs seront initialisées automatiquement par NULL
s. Il s'agit de la méthode C++ préférée.
Mise à jour: depuis C++ 11, il existe un autre moyen: utiliser
std::array<T*, SIZE> array = {};
Cela se comporte plus comme une version corrigée d'un tableau de style C (en particulier, évite les allocations dynamiques), transporte sa taille et ne se décompose pas en un pointeur. Cependant, la taille doit être connue au moment de la compilation.
Normalement, un tableau ne sera pas initialisé par défaut, mais si vous initialisez explicitement un ou plusieurs éléments, tous les éléments restants seront automatiquement initialisés à 0. Puisque 0 et NULL
sont équivalents, vous pouvez donc initialiser un tableau de pointeurs vers NULL
comme ceci:
float * foo[42] = { NULL }; // init array of pointers to NULL
Je ne sais pas comment cela se fait. J'ai entendu qu'un pointeur est défini sur NULL par défaut, bien que je ne sais pas si cela est garanti/dans la norme C++.
Il n'est pas garanti par la norme C++. Les types intégrés (comme les pointeurs) sont remplis d'ordures sauf indication contraire.
Je ne sais pas non plus si l'initialisation via le nouvel opérateur par rapport à l'allocation normale peut aussi faire la différence.
Qu'entendez-vous par "allocation normale"? Si vous parlez d'une variable automatique, vous pouvez le faire:
MyType * pointers[2] = {}
et les pointeurs doivent être initialisés à NULL.
void* p[10] = { 0 };