C++ Comment définissez-vous un tableau de pointeurs à null dans une liste d'initialiseurs de la façon suivante?
je suis conscient que vous ne pouvez pas utiliser une liste d'initialiseur pour un tableau. Cependant, j'ai entendu parler de façons dont vous pouvez définir un tableau de pointeurs à NULL d'une manière qui est similaire à une liste d'initialiseurs.
Je ne sais pas comment cela se fait. J'ai entendu dire qu'un pointeur est défini à NULL par défaut, mais je ne sais pas si c'est garanti/ dans le standard c++. Je ne suis pas sûr non plus si l'initialisation par le nouvel opérateur par rapport à l'allocation normale peut faire une différence trop.
Edit: je veux dire faire ceci 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 un Vecteur.
6 réponses
pour définir un tableau de pointeurs à nulls dans la liste des initialisateurs du constructeur, vous pouvez utiliser le ()
initialisation
struct S {
int *a[100];
S() : a() {
// `a` contains null pointers
}
};
malheureusement, dans la version actuelle du langage le ()
initializer est le seul initialiseur que vous pouvez utiliser avec un membre de tableau dans la liste d'initialiseur de constructeur. Mais apparemment, c'est ce dont tu as besoin dans ton cas.
()
a le même effet sur les tableaux alloués à new[]
int **a = new int*[100]();
// `a[i]` contain null pointers
Dans d'autres contextes, vous pouvez utiliser le {}
agrégation de l'initialiseur 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
et NULL
entre le {}
. La paire vide de {}
fera l'amende juste.
vous pouvez passer du tableau à std::vector
et utiliser
std::vector<T*> v(SIZE);
les valeurs seront initialisées par NULL
s automatiquement. C'est la méthode C++ préférée.
mise à jour: depuis c++11, Il y a une autre façon: utiliser
std::array<T*, SIZE> array = {};
cela se comporte plus comme une version corrigée du tableau c-style (en particulier, évite les attributions dynamiques), porte sa taille autour et ne se détériore pas à un pointeur. La taille, cependant, doit être connu à compiler temps.
normalement, un tableau ne sera pas initialisé par défaut, mais si vous initialisez explicitement un ou plusieurs éléments, les éléments restants seront automatiquement initialisés à 0. Depuis 0 et NULL
sont équivalents par conséquent, vous pouvez initialiser un tableau de pointeurs NULL
comme ceci:
float * foo[42] = { NULL }; // init array of pointers to NULL
Je ne sais pas comment cela se fait. J'ai entendu dire qu'un pointeur est défini à NULL par défaut, mais je ne sais pas si c'est garanti/ dans le standard c++.
Il n'est pas garanti par le standard c++. Les types intégrés ( comme les pointeurs ) sont remplis de déchets, sauf indication contraire.
Je ne suis pas sûr non plus si l'initialisation par le nouvel opérateur par rapport à l'allocation normale peut faire une différence aussi.
Que faites-vous dire par "répartition normale" ? Si vous parlez d'une variable automatique, alors vous pouvez faire ceci:
MyType * pointers[2] = {}
et les pointeurs doivent être initialisés à NULL.
si vous avez un tableau de membres alors il n'y a aucun moyen d'initialiser, à moins que ce soit un membre statique. Si le tableau n'est pas un membre statique, alors vous aurez à remplir à l'intérieur du corps du constructeur.
cela dit, il y a de fortes chances pour que vous utilisiez un std::vector
. Autre que pour des raisons techniques telles que l'indisponibilité d'une STL standard pour votre plateforme, ou la performance légèrement inférieure a std::vector
est meilleur qu'un tableau par tous les critères. Si la performance est la question assurez-vous que vous avez profilé et savoir par des nombres que c'est un problème.