Partage
  • Partager sur Facebook
  • Partager sur Twitter

Valeurs par défaut du constructeur

Point pas très clair à mes yeux

Sujet résolu
    16 juillet 2007 à 18:52:27

    Bonjour, je viens de découvrir les classes et je voulais savoir un truc à propos du constructeur et de ces valeurs par défaut:


    Duree::Duree(int heures = 0,int minutes = 0,int secondes = 0) : m_heures(heures), m_minutes(minutes), m_secondes(secondes)
    {
    }
     


    Voilà mon constructeur de la classe Duree.
    Ce qui m'intrigue c'est les "= 0" , ca veut dire que si l'utilisateur n'initialise pas la classe avec des valeurs, alors m_heures,m_minutes et m_secondes seront = 0 ?
    Mais si il l'initialise avec des valeurs, alors m_heures,m_minutes et m_secondes seront = valeurs entrées?


    Duree Init1; // par exemple: m_heures = 0 ?
    Duree Init2(); // par exemple: m_heures = 0 ?
    Duree Init3(23,32,54); // par exemple: m_heures = 23 ?
     


    Cordialement, Fred.
    • Partager sur Facebook
    • Partager sur Twitter
      16 juillet 2007 à 19:23:26

      Exactement


      Duree D1;            // {0,0,0}
      Duree D2(23);        // {23,0,0}
      Duree D3(23,56);     // {23,56,0}
      Duree D4(23,56,25)// {23,56,25}
       
      • Partager sur Facebook
      • Partager sur Twitter
      Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
        16 juillet 2007 à 19:48:43

        Duree Init2();


        Ceci ne ne compilera pas. Il ne faut pas mettre les parenthèses pour appeler le constructeur par défaut.

        Duree Init2; 
        • Partager sur Facebook
        • Partager sur Twitter
        Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
          16 juillet 2007 à 19:52:28

          D'accord, mais ce qui m'embrouille c'est que m@theo21 fait ceci dans son cours:


          Arme::Arme() : m_nom("Epée rouillée"), m_degats(10)
          {
          }

          Arme::Arme(string nom, int degats) : m_nom(nom), m_degats(degats)
          {
          }
          //Surcharge de constructeurs
           


          Ce serait donc EXACTEMENT la même chose d'écrire:


          Arme::Arme(string nom = "Epée rouillée", int degats = 10) : m_nom(nom), m_degats(degats)
          {
          }
          // On dit toujours qu'il y a une surcharge de constructeurs ?
           

          ?

          Cordialement, Fred.


          Edit réponse de Nanoc:

          Donc avec la méthode de matheo la dessus, on pourrait faire:
          Duree Init2()

          ??
          • Partager sur Facebook
          • Partager sur Twitter
            16 juillet 2007 à 20:08:16

            Citation : fredleshaman

            D'accord, mais ce qui m'embrouille c'est que m@theo21 fait ceci dans son cours:


            Arme::Arme() : m_nom("Epée rouillée"), m_degats(10)
            {
            }

            Arme::Arme(string nom, int degats) : m_nom(nom), m_degats(degats)
            {
            }
            //Surcharge de constructeurs
             



            Ce serait donc EXACTEMENT la même chose d'écrire:


            Arme::Arme(string nom = "Epée rouillée", int degats = 10) : m_nom(nom), m_degats(degats)
            {
            }
            // On dit toujours qu'il y a une surcharge de constructeurs ?
             


            ?

            Cordialement, Fred.


            ??


            Non ce n'est pas la même chose, dans l'exemple de m@teo, les valeurs des attributs sont fixées par construction. Quelque soit l'instance d'Arme que tu vas créer ce sera une épée rouillée avec 10 dégats. Avec des valeurs par défauts, si tu crées une arme sans rien préciser, ce sera une épée rouillée de 10 de dégats, mais tu pourras aussi créer d'autres armes.
            • Partager sur Facebook
            • Partager sur Twitter
            Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
              16 juillet 2007 à 20:33:54

              Et par rapport à ma remarque, on ne peut JAMAIS appeler le constructeur par défaut en utilisant les parenthèses. Soit on met pas de parenthèses, soit on met des parenthèses avec des arguments.

              Si tu veux comprendre pourquoi, essaye et tu verras que le compilateur croit que tu déclares une nouvelle fonction, ce qui est pas le cas.
              • Partager sur Facebook
              • Partager sur Twitter
              Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                16 juillet 2007 à 20:47:59

                Ok, c'est un peu plus clair maintenant, merci de vos réponses, ++.
                • Partager sur Facebook
                • Partager sur Twitter
                  17 juillet 2007 à 1:53:05

                  NB: Attention, dans son tuto, Mathéo n'a pas déclaré les valeurs par défaut au bon endroit.

                  Elles se mettent normalement dans la signature de la déclaration des fonctions membre. Pas au niveau de la définition.

                  (Cela compilera, mais avec des effets de bord assez subtils, cf explications dans les commentaires liés aux tuto)
                  • Partager sur Facebook
                  • Partager sur Twitter
                  C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

                  Valeurs par défaut du constructeur

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown