Question

J'ai lu un livre S. lippman "Inside C ++ Object Model", y a-t-il un tel code

class Foo { public: int val; Foo *pnext; };
void foo_bar()
{
// Oops: program needs bar's members zeroed out
Foo bar;
Foo* baz = new Foo(); // this line i added myself
if ( bar.val || bar.pnext )
// ... do something
// ...
}

et il dit que "un constructeur par défaut n'est pas synthétisé pour ce fragment de code.

Les objets globaux sont garantis pour avoir leur mémoire associée "zéro out" au start-up du programme. Les objets locaux alloués sur la pile de programme et les objets de tas alloués sur le libre magasin n'ont pas leur mémoire associée à zéro; La mémoire conserve plutôt le modèle de bit arbitraire de son utilisation précédente. "

Dans ce code, l'objet BAZ a été créé sur le tas, et selon ce qui a été dit ci-dessus, cet objet n'est pas global et il ne sera pas appelé le constructeur par défaut. Je comprends correctement?

Était-ce utile?

La solution

Les parenthèses dans new Foo() spécifier valeur d'initialisation; Cela signifie essentiellement que chaque membre est initialisé zéro. Si à la place tu as dit new Foo, alors les membres seraient laissés non initialisés, comme ils le sont pour votre variable automatique.

Malheureusement, pour évaluer la variable automatique, vous ne pouvez pas écrire Foo bar(), puisque cela déclare une fonction. Tu auras besoin

Foo bar{};        // C++11
Foo bar = Foo();  // Historical C++

Autres conseils

Quand vous faites ceci:

Foo* baz = new Foo();

vous allouez dynamiquement à un Foo instance et valeur-initiative ce. Pour les pods, cela signifie que les membres sont initialisés zéro. Si vous l'aviez dit (en supposant un contexte non global):

Foo* baz = new Foo;

puis le Foo L'instance serait initialisée par défaut, ce qui signifierait qu'aucune initialisation de ses membres n'est effectuée, car ce sont des pods.

Cela s'applique également aux instances de stockage automatiques:

Foo f0; // default initializaiton: members not zeroed out.
Foo f1 = Foo(); // value initialization: members zeroed out.
Foo f2{}; // C++11 value initialization: members zeroed out.
Foo f3(); // Ooops! Function declaration. Something completely different.

Si une classe n'a pas de constructeur par défaut (et aucun autre constructeur), le compilateur en créera un pour vous. Il faut le faire, ou vous ne pourriez pas créer des instances de la classe. Cependant, le constructeur par défaut généré ne fera rien.

Quel ajout de l'ensemble vide de parenthèses new Foo() fait, c'est valoriser l'initialisation de l'objet alloué, ce qui signifie que les membres sont initialisés à leurs valeurs "par défaut", ce qui est nul pour les valeurs entières et les points flottants, et nullptr pour les pointeurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top