C++ - valeur non initialisée vector<int>
Je comprends de la réponse à cette question que les valeurs de global/statiques non initialisées int sera de 0. La réponse à cette une dit que pour les vecteurs, le constructeur par défaut pour le type d'objet sera appelée.
Je suis incapable de comprendre - ce qui se passe quand j'ai vector<int> v(10)
dans une fonction locale. Quel est le constructeur par défaut pour int? Que faire si j'ai vector<int> v(10)
déclaré à l'échelle mondiale?
Ce que je vois, c'est que vector<int> v(10)
dans une fonction locale résultant dans des variables de 0 - mais je ne suis pas sûr si c'est juste à cause de mon compilateur ou est la partie fixe du comportement attendu.
Vous devez vous connecter pour publier un commentaire.
Le zéro de l'initialisation est spécifié dans la norme en tant que par défaut initialisation à zéro/initialisation de la valeur pour builtin types, principalement à soutenir que ce type de cas dans l'utilisation du modèle.
Notez que ce comportement est différent d'une variable locale comme
int x;
qui laisse la valeur non initialisée (comme dans le langage C que le comportement hérité de l').Il n'est pas un comportement indéterminé, un vecteur est initialisée automatiquement sur tous ses éléments. Vous pouvez sélectionner une valeur par défaut différente si vous le souhaitez.
Le constructeur est:
vector( size_type, T t = T() )
et pour l'int, le type par défaut (retourné par la
int()
) est 0.Dans un local en fonction de ce:
int x;
n'est pas garanti pour initialiser la variable à 0.
int x = int();
en serait ainsi.
int x();
malheureusement, n'a pas non plus mais déclare une fonction.
Le constructeur, vous utilisez en fait prend deux arguments, le second est facultatif. Sa déclaration ressemble à ceci:
Le premier argument est le nombre d'éléments à créer dans la
vector
initialement; le deuxième argument est la valeur à copier dans chacun de ces éléments.Pour n'importe quel type d'objet
T
,T()
est appelé "initialisation de la valeur." Pour les types numériques, il vous donne0
. Pour un type de classe avec un constructeur par défaut, il vous donne un objet qui a été par défaut construit en utilisant ce constructeur.Pour plus de détails sur la "magie parenthèses, je te recommande la lecture de Michael Burr excellente réponse à la question "Les parenthèses après le nom du type de faire la différence avec les nouvelles?" Il discute de la valeur d'initialisation lorsqu'il est utilisé avec
new
en particulier, mais pour la plupart, est applicable à la valeur d'initialisation partout où il peut être utilisé.vector(size_type n)
, et les deux arguments celui que vous mentionnez n'a plus de valeur par défaut pour le deuxième argument. Cependant, la sémantique est la même: vous obtenez la valeur d'initialisation, pas d'initialisation par défaut. Voir en.cppreference.com/w/cpp/named_req/DefaultInsertablevaleur par défaut de
int
est égale à zéro. Doncvector<int> v(10)
initialise tous les 10 éléments avec zéro!De sortie:
Exécuter à ideone: http://ideone.com/IbcyH
Par défaut, les éléments du vecteur sont initialisé à zéro et non pas par défaut-initialisé. Ce sont deux choses différentes, mais liées entre concepts:
zéro-initialisation est ce qui est fait pour les objets statiques, de ne pas avoir une initialisation explicite et ce qui est fait pour un membre donné dans la initialisée liste avec un initialiseur de
()
. Pour les types de base, la valeur utilisée est de 0 converties dans le type.défaut d'initialisation est ce qui est fait pour pas explicitement non initialisé les variables statiques et les membres. Pour les types de base de rester non initialisée.
(Et C++0X introduit la valeur d'initialisation qui est encore différent).
L'initialisation par défaut pour un
int
type est de l'initialiser à 0.Cela est vrai de la plupart (si pas tous) types de primitives:
char
initialiser à(char)0
(ou'\0'
si vous préférez),float
initialiser à0.0f
, et un pointeur initialise àNULL
. Pour les autres types, le constructeur sans paramètre est invoquée.En général, l'initialisation par défaut devrait se passer assez bien quand vous n'êtes pas en mesure de spécifier un constructeur (ou choisir de ne pas).