web-dev-qa-db-fra.com

C ++ - valeur du vecteur non initialisé <int>

Je comprends de la réponse à cette question que les valeurs de l'intégralité non statique globale/statique seront 0. La réponse à celle-ci dit que pour les vecteurs, le constructeur par défaut de l'objet type sera appelé.

Je n'arrive pas à comprendre - ce qui se passe lorsque 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é globalement?

Ce que je vois, c'est que vector<int> v(10) dans une fonction locale se traduit par des variables étant 0 - mais je ne suis pas sûr si c'est juste à cause de mon compilateur ou si c'est le comportement attendu fixe.

42
anon

L'initialisation zéro est spécifiée dans la norme comme initialisation zéro par défaut/initialisation de la valeur pour les types intégrés, principalement pour prendre en charge uniquement ce type de cas lors de l'utilisation du modèle.

Notez que ce comportement est différent d'une variable locale telle que int x; qui laisse la valeur non initialisée (comme dans le langage C dont le comportement est hérité).

40
Mark B

Ce n'est pas un comportement indéfini, un vecteur initialise automatiquement 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 int, le type par défaut (renvoyé par int()) est 0.

Dans une fonction locale, cela:

int x;

n'est pas garanti pour initialiser la variable à 0.

int x = int();

le ferait.

int x();

ne fait malheureusement ni l'un ni l'autre mais déclare une fonction.

40
CashCow

Le constructeur que vous utilisez prend en fait deux arguments, le second étant facultatif. Sa déclaration ressemble à ceci:

explicit vector(size_type n, const T& value = T())

Le premier argument est le nombre d'éléments à créer dans le vector initialement; le deuxième argument est la valeur à copier dans chacun de ces éléments.

Pour tout type d'objet T, T() est appelé "initialisation de valeur". Pour les types numériques, il vous donne 0. Pour un type de classe avec un constructeur par défaut, il vous donne un objet qui a été construit par défaut à l'aide de ce constructeur.

Pour plus de détails sur les "parenthèses magiques", je recommanderais de lire l'excellente réponse de Michael Burr à la question "Les parenthèses après le nom du type font-elles une différence avec new?" Il discute de l'initialisation de la valeur lorsqu'elle est utilisée avec new spécifiquement, mais pour la plupart s'applique à l'initialisation de la valeur partout où il peut être utilisé.

10
James McNellis

la valeur par défaut de int est zéro. Donc vector<int> v(10) initialisera les 10 éléments avec zéro!

int main() {
        std::vector<int> v(10);
        for ( int i = 0 ; i < 10 ; i++ )
           std::cout << v[i] << std::endl;
        return 0;
}

Production:

0
0
0
0
0
0
0
0
0
0

Exécutez sur ideone: http://ideone.com/IbcyH

3
Nawaz

L'initialisation par défaut d'un type int consiste à l'initialiser à 0.

Cela est vrai de la plupart (sinon de tous) les types primitifs: char s'initialisera en (char)0 (ou '\0' si vous préférez), float sera initialisé à 0.0f, et tout pointeur s'initialise sur NULL. Pour les autres types, le constructeur sans paramètre est appelé.

En général, l'initialisation par défaut devrait se produire à peu près chaque fois que vous n'êtes pas en mesure de spécifier un constructeur (ou choisissez de ne pas le faire).

1
Platinum Azure

Par défaut, les éléments vectoriels sont initialisés à zéro et non initialisés par défaut. Ce sont deux concepts différents mais liés:

  • l'initialisation zéro est ce qui est fait pour les objets statiques n'ayant pas d'initialisation explicite et ce qui est fait pour un membre donné dans la liste initialisée avec un initialiseur de (). Pour les types de base, la valeur utilisée est 0 convertie en type.

  • l'initialisation par défaut est ce qui est fait pour les variables et les membres non statiques non initialisés explicitement. Pour les types de base, il reste non initialisé.

(Et C++ 0X introduit l'initialisation de valeur qui est toujours différente).

1
AProgrammer