IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Questions sur ces trois constructeurs


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut Questions sur ces trois constructeurs
    Bonjour tout le monde,

    J'ai une question sur les constructeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CReleve::CReleve()
    :m_Annee(0),m_Superficie(0.0)
    {
    }
    Je peux lire dans le code de ce constructeur :

    m_Annee(0)

    Cela veut-il dire que l'on affecte à la donnée membre Annee la valeur 0 ? (là j'ai juste besoin d'une confirmation car j'en suis presque sûr).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CReleve::CReleve(const CReleve& Source)
    :m_Zone(Source.m_Zone),m_Annee(Source.m_Annee),m_Superficie(Source.m_Superficie)
    {
    }
    Ici, il me semble qu'un objet Source est créé et qu'il est de type CReleve, on affecte alors les valeurs de Source.m_Zone... au constructeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CReleve::CReleve(const char* UnNomDeZone, short UneAnnee, double UneSuperficie)
    :m_Annee(0),m_Superficie(0.0)
    {
    	DefinirZone(UnNomDeZone);
    	DefinirAnnee(UneAnnee);
    	DefinirSuperficie(UneSuperficie);
    }
    Je vois ici que via le constructeur, on peut appeler des fonctions pour "alimenter" le constructeur ?

    Je présûme que l'on va mettre l'année à zéro, mais si un utilisateur devrait rentrer l'année, on ne mettrait pas alors m_Annee(0), on aurait simplement m_Superficie(0.0) ?

    Dans ces trois constructeurs, y'a-t'il un constructeur par copie ?

    Merci d'avance pour votre aide so precious.

    beegees

  2. #2
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Bonjour,

    Le premier constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CReleve::CReleve()
    :m_Annee(0),m_Superficie(0.0)
    {
    }
    est le constructeur par défaut, c'est lui qui sera appelé par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CReleve MonReleve;      // Appel du constructeur par défaut de CRelevé
    C'est également lui qui sera utilisé par défaut dans les containers stl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<CReleve> MonVector(2);   // Construction de 2 relevé à l'aide du constructeur par défaut
    Aussi il me semble qu'il est préférable d'initialiser toutes les données membres de la classe dans la liste d'initialisation si c'est possible ce qui pourrait donner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CReleve::CReleve()
    :m_Annee(0),m_Superficie(0.0),m_Zone("")
    {
    }
    Citation Envoyé par beegees
    Je peux lire dans le code de ce constructeur :

    m_Annee(0)

    Cela veut-il dire que l'on affecte à la donnée membre Annee la valeur 0 ? (là j'ai juste besoin d'une confirmation car j'en suis presque sûr)
    Il s'agit d'une liste d'initialisation, on affecte pas mais on initialise avec la valeur donnée en paramètre.

    Citation Envoyé par beegees
    Ici, il me semble qu'un objet Source est créé et qu'il est de type CReleve, on affecte alors les valeurs de Source.m_Zone... au constructeur
    Non l'objet source est passé en paramètre par référence donc il n'est pas construit...En revanche on copie bien les valeurs de source dans les données membres, c'est le constructeur par copie...

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Citation Envoyé par babar63 Voir le message
    Aussi il me semble qu'il est préférable d'initialiser toutes les données membres de la classe dans la liste d'initialisation si c'est possible ce qui pourrait donner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CReleve::CReleve()
    :m_Annee(0),m_Superficie(0.0),m_Zone("")
    {
    }
    si m_Zone est une std::string, ça ne sert à rien de l'initialiser

  4. #4
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Salut,

    le premier constructeur que tu montres est ce qu'on appelle un constructeur par defaut.
    Il est utilisé lorsqu'on fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Contructeur par defaut de MaClasse appellé
    MaClasse a;
    Ce que tu vois après les deux points ':' c'est la liste d'initialisation. C'est ici que sont initialisées pour la premiere fois les membres et les bases (si elle hérite) de notre classe.
    Effectivement, faire : m_Annee(0) revient à faire m_Annee = 0; dans le corps du constructeur, mais il est préférable, pour des initialisation triviales, d'utiliser la liste. Je te laisse chercher pourquoi.

    Le deuxieme est un constructeur par copie, car il prend en paramètre une référence d'objet du même type que l'objet construit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MaClasse a;
    // Contructeur par copie de MaClasse appellé
    MaClasse b( a );
    Généralement implémenté lorsqu'on souhaite autoriser la duplication un objet. Parfois, faire une copie d'un objet n'a pas de sens, on interdit alors la copie en déclarant comme privé ce constructeur et en ne l'implémentant pas. Ici chaque membre est initialisé avec les autres membres de l'objet. On voit que m_zone, qui n'était pas initialisé dans le constructeur par defaut (peut-être pas le besoin), l'est ici.

    Dans le troisieme, il s'agit d'un constructeur avec paramètres divers (pas de nom particulier enfin je crois pas).
    Effectivement, dans n'importe quel constructeur, tu peux appeller n'importe quelle fonction (sauf les fonctions virtuelles de la classe en cours de construction). C'est idem dans le destructeur.

    Je te conseille (vivement) d'aller faire un tour vers la FAQ C++ (très bien faite) qui doit déjà répondre à toutes ces questions de bases et bien d'autres.

    A+

  5. #5
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Citation Envoyé par nikko34
    si m_Zone est une std::string, ça ne sert à rien de l'initialiser
    En effet, l'initialiser avec "" c'était assez stupide puisque c'est le comportement par défaut (enfin si il s'agit d'une std::string) , ce que je voulais dire c'était plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CReleve::CReleve()
    :m_Annee(0),m_Superficie(0.0),m_Zone("MaChaineParDefaut")
    {
    }
    Ou alors en effet laisser le constructeur par défaut de std::string faire son travail si l'on souhaite une chaine vide...

  6. #6
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Salut,

    le premier constructeur que tu montres est ce qu'on appelle un constructeur par defaut.
    Il est utilisé lorsqu'on fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Contructeur par defaut de MaClasse appellé
    MaClasse a;
    Ce que tu vois après les deux points ':' c'est la liste d'initialisation. C'est ici que sont initialisées pour la premiere fois les membres et les bases (si elle hérite) de notre classe.
    Effectivement, faire : m_Annee(0) revient à faire m_Annee = 0; dans le corps du constructeur, mais il est préférable, pour des initialisation triviales, d'utiliser la liste. Je te laisse chercher pourquoi.

    Le deuxieme est un constructeur par copie, car il prend en paramètre une référence d'objet du même type que l'objet construit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MaClasse a;
    // Contructeur par copie de MaClasse appellé
    MaClasse b( a );
    Généralement implémenté lorsqu'on souhaite autoriser la duplication un objet. Parfois, faire une copie d'un objet n'a pas de sens, on interdit alors la copie en déclarant comme privé ce constructeur et en ne l'implémentant pas. Ici chaque membre est initialisé avec les autres membres de l'objet. On voit que m_zone, qui n'était pas initialisé dans le constructeur par defaut (peut-être pas le besoin), l'est ici.

    Dans le troisieme, il s'agit d'un constructeur avec paramètres divers (pas de nom particulier enfin je crois pas).
    Effectivement, dans n'importe quel constructeur, tu peux appeller n'importe quelle fonction (sauf les fonctions virtuelles de la classe en cours de construction). C'est idem dans le destructeur.

    Je te conseille (vivement) d'aller faire un tour vers la FAQ C++ (très bien faite) qui doit déjà répondre à toutes ces questions de bases et bien d'autres.

    A+
    Citation Envoyé par babar63 Voir le message
    Bonjour,

    Le premier constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CReleve::CReleve()
    :m_Annee(0),m_Superficie(0.0)
    {
    }
    est le constructeur par défaut, c'est lui qui sera appelé par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CReleve MonReleve;      // Appel du constructeur par défaut de CRelevé
    C'est également lui qui sera utilisé par défaut dans les containers stl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<CReleve> MonVector(2);   // Construction de 2 relevé à l'aide du constructeur par défaut
    Aussi il me semble qu'il est préférable d'initialiser toutes les données membres de la classe dans la liste d'initialisation si c'est possible ce qui pourrait donner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CReleve::CReleve()
    :m_Annee(0),m_Superficie(0.0),m_Zone("")
    {
    }
    Il s'agit d'une liste d'initialisation, on affecte pas mais on initialise avec la valeur donnée en paramètre.

    Non l'objet source est passé en paramètre par référence donc il n'est pas construit...En revanche on copie bien les valeurs de source dans les données membres, c'est le constructeur par copie...
    Bonjour,

    Merci à vous deux pour vos réponses hyper complètes.

    J'aim maintenant compris à quoi sert le constructeur par copie.

    S'est super sympa, j'ai maintenant moins de doute concernant les constructeurs.

    Encore merci.

    beegees

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Effectivement, dans n'importe quel constructeur, tu peux appeller n'importe quelle fonction (sauf les fonctions virtuelles de la classe en cours de construction).
    Tu peux aussi appeler des fonctions virtuelles, il faut juste faire attention à quelle version sera vraiment appelée. Voir http://www.developpez.net/forums/sho....php?p=2929434 pour plus d'infos.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. [quota] deux trois questions sur les quota sous Redhat
    Par pierrot10 dans le forum Administration système
    Réponses: 3
    Dernier message: 25/03/2009, 11h38
  2. Question sur les constructeurs
    Par TocTocKiéLà? dans le forum C++
    Réponses: 2
    Dernier message: 27/06/2007, 17h52
  3. [POO]Question sur les constructeurs
    Par Burinho dans le forum Langage
    Réponses: 16
    Dernier message: 08/04/2006, 21h56
  4. Réponses: 2
    Dernier message: 04/12/2005, 21h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo