web-dev-qa-db-fra.com

int x; int y; int * ptr; n'est pas l'initialisation, non?

Je lis 'C++ All-in-One for Dummies' de J. P. Mueller et J. Cogswell et suis tombé sur ceci:

#include <iostream>
using namespace std;
int main()
{
    int ExpensiveComputer;
    int CheapComputer;
    int *ptrToComp;
...

Ce code commence par initialiser tous les goodies impliqués - deux entiers et un pointeur sur un entier.

Juste pour confirmer, c'est une erreur et devrait se lire '... en déclarant', non? C'est juste étrange pour moi que de telles erreurs de base fassent encore leur chemin vers les livres.

24
John Allison

Du point de vue de la langue, c'est initialisation par défaut . Le problème est qu'ils sont initialisés à des valeurs indéterminées.

sinon, rien n'est fait: les objets à durée de stockage automatique (et leurs sous-objets) sont initialisés à des valeurs indéterminées.

L'initialisation par défaut des variables non-classe avec une durée de stockage automatique et dynamique produit des objets avec des valeurs indéterminées (les objets statiques et thread-local sont initialisés à zéro)

Notez que toute tentative de lecture de ces valeurs indéterminées conduit à UB .

De la norme, [dcl.init]/7

Initialiser par défaut un objet de type T signifie:

  • Si T est un type de classe (éventuellement qualifié par cv) ([classe]), les constructeurs sont pris en compte. Les constructeurs applicables sont énumérés ([over.match.ctor]), et le meilleur pour l'initialiseur () est choisi via la résolution de surcharge ([over.match]). Le constructeur ainsi sélectionné est appelé, avec une liste d'arguments vide, pour initialiser l'objet.

  • Si T est un type de tableau, chaque élément est initialisé par défaut.

  • Sinon, aucune initialisation n'est effectuée.

23
songyuanyao

Oui vous avez raison.

Vous avez déclaré et défini ces variables, vous avez fait pas initialisez-les!

PS: Quelle est la différence entre une définition et une déclaration?

7
gsamaras

Ce code à la fois déclare et définit trois variables mais ne les initialise elles (leurs valeurs sont dites être indéterminé ).

Une déclaration de variable doit uniquement inclure le mot clé extern.

4
Maxim Egorushkin

Droite. Par conséquent, les "nuls". :)

Nous ne pouvons même pas attribuer cela à l'héritage; historiquement, les programmeurs C déclaraient * une variable, puis la "initialisaient" plus tard avec sa première affectation.

Mais il n'a jamais été question de simplement déclarer une variable, sans initialiseur, comme "l'initialiser". **

Le libellé est donc tout simplement faux.

* Techniquement nous parlons de définitions , mais quand nous disons "déclarer une variable", nous entendons presque toujours définir des déclarations.

** Bien que les objets avec une durée de stockage statique subissent leur propre phase d'initialisation zéro avant toute autre chose, donc renoncer à l'initialisation vous-même n'est pas une catastrophe dans ce cas. Pourtant, nous ne pouvons pas prétendre avoir initialisé cet objet.