Pourquoi le code suivant ne fonctionnera pas:
#include <iostream> class Entity { public: /* Entity() { std::cout << "Create Entity with default constructor" << std::endl; } */ Entity(int x) { std::cout << "Create Entity with " << x << std::endl; } }; class Example { Entity ent; int age; public: Example() //: ent(7), age(7) { ent=Entity(7); age=7; } }; int main() { Example s1; return 0; }
3 Réponses :
à l'intérieur de l'exemple code> code> constructeur, la variable de membre La solution consiste à utiliser une liste d'initialiseurs de constructeur, que vous avez commentée dans l'exemple indiqué. P> comme pour p> < Pré> xxx pré> qui déclare ENT code> doit déjà être construite. C'est cette construction que l'on entend par l'erreur.
s1 code> en tant que fonction qui ne prend aucun argument et renvoie un exemple d'exemple code> objet p> p> p>
Mais pourquoi? J'abandonne la valeur en même temps, pourquoi elle doit d'abord être construite avec le constructeur par défaut.
@smith parce que c'est comment C ++ fonctionne. Au moment où le corps du constructeur est entré, tous les objets membres sont déjà i> construits.
@smith Affectation et initialisation sont deux choses différentes. À l'intérieur du corps de constructeur, vous ne faites que affectation i> à un objet déjà construit et initialisé. Il n'est pas différent d'avoir une variable globale entité entity; code> puis en attribuant à cela dans n'importe quelle fonction.
Lorsque vous définissez explicitement n'importe quel constructeur, le constructeur par défaut défini implicitement est supprimé et n'est pas disponible pour une utilisation.
Lorsque vous n'initialisez pas un membre explicitement à l'aide de la syntaxe de liste d'initialisation dans un constructeur, le constructeur par défaut est utilisé pour Inititilisez-le. P>
Example() : ent(7), age(7) { }
Mais pourquoi? J'abandonne la valeur en même temps, pourquoi elle doit d'abord être construite avec le constructeur par défaut.
Ce comportement est défini par la norme. Jetez un coup d'œil à la section de la norme qui parle de Initialisation des bases et des membres .
dans le corps de ce constructeur L'élément de données doit être déjà construit. Cependant, il ne peut pas être construit à l'aide du constructeur par défaut qui est absent. Cette expression Vous devez écrire au moins p> ent code> utilisé dans l'instruction d'affectation (dans les opérateurs d'affectation peut être utilisé des objets déjà construits)
entité (7) code> ne crée pas l'objet
ent code>. Il crée un objet temporaire attribué à
ENT code> à l'aide de l'opérateur d'affectation de copie par défaut défini implicitement par le compilateur. P>
Example() : ent(7), age(7)
{
}
Mais pourquoi? J'abandonne la valeur en même temps, pourquoi elle doit d'abord être construite avec le constructeur par défaut.
@smith Où donnez-vous une valeur? Dans la déclaration d'affectation lorsque l'objet doit être déjà créé? Dans le corps d'un constructeur, vous avez affaire à des membres de données déjà créés.
Pourquoi j'ai besoin de créer ENT avant d'y attribuer une valeur? Par exemple, prenez INT X = 10; Il ne crée pas X avec 0 puis donnez-le 10.
@smith il y a une différence entre int x = 10; et int x; x = 10; Dans le premier cas, l'objet X est créé et initialisé. Dans le second cas, l'objet a créé d'abord et une valeur est attribuée à l'objet déjà créé. Comment pouvez-vous attribuer une valeur pour quelque chose qui n'était pas créé ?!
Parce que vous avez commenté la liste des initialiseurs,
: ENT (7), âge (7) code>.
exemple S1 (); code> déclare une fonction appelée S1 qui ne prend aucun paramètre et renvoie un exemple d'objet.
Est-ce que cela répond à votre question? constructeur par défaut avec des crochets vides