0
votes

Le constructeur par défaut est appelé sans référence

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 commentaires

Parce que vous avez commenté la liste des initialiseurs, : ENT (7), âge (7) .


exemple S1 (); 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


3 Réponses :


2
votes

à l'intérieur de l'exemple constructeur, la variable de membre ENT doit déjà être construite. C'est cette construction que l'on entend par l'erreur.

La solution consiste à utiliser une liste d'initialiseurs de constructeur, que vous avez commentée dans l'exemple indiqué.


comme pour < Pré> xxx

qui déclare s1 en tant que fonction qui ne prend aucun argument et renvoie un exemple d'exemple objet


3 commentaires

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à construits.


@smith Affectation et initialisation sont deux choses différentes. À l'intérieur du corps de constructeur, vous ne faites que affectation à un objet déjà construit et initialisé. Il n'est pas différent d'avoir une variable globale entité entity; puis en attribuant à cela dans n'importe quelle fonction.



0
votes

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)
{
}


2 commentaires

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 .



1
votes

dans le corps de ce constructeur xxx pré>

L'élément de données ent code> utilisé dans l'instruction d'affectation (dans les opérateurs d'affectation peut être utilisé des objets déjà construits) xxx pré>

doit être déjà construit. Cependant, il ne peut pas être construit à l'aide du constructeur par défaut qui est absent. Cette expression 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>

Vous devez écrire au moins p>

Example() : ent(7), age(7)
{
}


4 commentaires

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éé ?!