C++ Comment définissez-vous un tableau de pointeurs à null dans un initialiser la liste comme façon de faire?
Je suis conscient que vous ne pouvez pas utiliser une initialiser la liste pour un tableau. Toutefois, j'ai entendu parler de façons que vous pouvez définir un tableau de pointeurs à NULL dans une manière qui est similaire à un initialiser la liste.
Je ne suis pas certain de la façon dont cela est fait. J'ai entendu dire qu'un pointeur est NULL par défaut, bien que je ne sais pas si cela est garanti/dans la norme C++. Je suis également pas sûr si l'initialisation par le nouvel opérateur par rapport à la normale de répartition peut aussi faire la différence.
Edit: je veux dire pour ce faire, dans un fichier d'en-tête ou le constructeur d'initialisation de la liste. Je ne veux pas le mettre dans le constructeur, et je ne veux pas utiliser un Vecteur.
Vous devez vous connecter pour publier un commentaire.
Afin de définir un tableau de pointeurs à null dans le constructeur de l'initialiseur de la liste, vous pouvez utiliser le
()
initialiseurMalheureusement, dans la version actuelle de la langue de la
()
initialiseur est le seul initialiseur que vous pouvez utiliser avec un membre du groupe dans le constructeur de l'initialiseur de la liste. Mais apparemment, c'est ce que vous avez besoin dans votre cas.La
()
a le même effet sur les tableaux alloués avecnew[]
Dans d'autres contextes, vous pouvez utiliser le
{}
globale de l'initialiseur pour obtenir le même effetNoter qu'il n'y a absolument pas besoin de presser un
0
ou unNULL
entre les{}
. Le vide paire de{}
fera l'amende juste.{ }
) précisément parce qu'il n'y a aucune raison pour qu'un objet de valeur par défaut doit être quelque chose ressemblant à0
, et le code de demander de l'initialisation d'un objet ne peut avoir aucune idée de ce qu'une valeur par défaut raisonnable pourrait être (en particulier dans les modèles).int *a = new int[100]();
crée un pointeur vers un tableau d'entiers qui sont initialisé à zéro sensa[i]
contiendrait le 0 et un pointeur déréférencé de la (i+1)ème entier dans ce tableau plutôt qu'un pointeur null.new
. 😛Vous pouvez passer de la matrice de
std::vector
et l'utilisationLes valeurs seront initialisées par
NULL
s automatiquement. C'est le préféré C++ façon.Mise à jour: Depuis C++11, il y a une façon de plus: à l'aide de
Il se comporte plus comme une version corrigée de C-gamme de style (en particulier, évite les allocations dynamiques), porte autour de sa taille et de ne pas se désintègrent en un pointeur. La taille, cependant, doit être connue au moment de la compilation.
vectors
doit être utilisé chaque fois que la taille de la constante n'est pas connu au moment de la compilation si.vector
on a au moins décent index-out-of-contrôle de la portée, ainsi que la copie des constructeurs etc. Ce qui conduit généralement à un moindre risque d'erreur de code. À mon humble avis, la nécessité pour le style C des tableaux n'est justifiée que par la nécessité d'une profonde manuel optimisations de code. Les compilateurs modernes sont généralement assez intelligent pour optimiser horsvector
's, de frais généraux dans la plupart des cas.std::array
, nous pouvons éviter l'allocation dynamique, tout en ayant encore de tous les autres avantages de conteneurs standard, y compris la capacité à faire des bornes-vérifié l'indexation (mais pas automatiquement que votre commentaire peut être lu à l'indiquent) à l'aide de.at()
comme dansvector
Normalement un tableau ne sera pas initialisée par défaut, mais si vous utilisez un ou plusieurs des éléments explicitement ensuite tous les autres éléments seront automatiquement initialisées à 0. Puisque 0 et
NULL
sont équivalents par conséquent, vous pouvez initialiser un tableau de pointeursNULL
comme ceci:NULL
.Je ne suis pas certain de la façon dont cela est fait. J'ai entendu dire qu'un pointeur est 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++. Construit dans les types ( comme les pointeurs ) sont remplis avec les ordures ménagères, sauf autrement.
Je suis également pas sûr si l'initialisation par le nouvel opérateur par rapport à la normale de répartition peut aussi faire la différence.
Qu'entendez-vous par "répartition normale" ? Si vous parlez d'une variable automatique, alors vous pouvez faire ceci:
MyType * pointers[2] = {}
et les pointeurs doit être initialisé à NULL.
{NULL, 0}
et{}
(ce dernier étant de préférence), plutôt que de spécifier une valeur pour tous les éléments dans le tableau.0
qui pourrait être un problème - c'est à dire que vous obtenez 0-initialisation si vous ne pas explicitement mention de 0. :S "Zéro initialisation est effectuée [...] pour les membres de la valeur initialisée types de classe qui n'ont pas de constructeurs, y compris la valeur d'initialisation des éléments de granulats pour laquelle aucun des initialiseurs sont fournis. [...] Un initialisé à zéro pointeur de pointeur null la valeur de son type, même si la valeur du pointeur null n'est pas partie intégrante de zéro." en.cppreference.com/w/cpp/language/zero_initialization Depuis C++11, utiliser{}
.Si vous avez un membre de la matrice puis il n'y a aucun moyen de les initialiser, sauf si c'est 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, les chances sont que vous êtes vraiment préférable d'utiliser une
std::vector
. Autre que pour des raisons techniques telles que l'indisponibilité d'un standard STL pour votre plate-forme, ou de la moindre performance d'unstd::vector
est mieux qu'un tableau par tout et tous les critères. Si la performance est la question, alors assurez-vous de profilés et de savoir par les numéros que c'est une question.