Partage
  • Partager sur Facebook
  • Partager sur Twitter

Valeurs par défaut

Sujet résolu
    8 août 2007 à 19:16:01

    Bonjour à tous :)

    Je suis présentement dans la lecture du tuto C/C++ de M@teo21 et un petit détail à propos des valeurs par défaut m'a un peut embrouillé.

    Citation : M@teo21

    Seul le prototype doit contenir les valeurs par défaut (pas la définition de la fonction).



    Et voici le code qui m'a mêlé:
    1. #include "Duree.h"
    2. Duree::Duree(int heures = 0, int minutes = 0, int secondes = 0) : m_heures(heures), m_minutes(minutes), m_secondes(secondes)
    3. {
    4. }


    Pourtant, il me semble que c'est la définition de la fonction( ou du constructeur ) puisque le prototype est dans le header.

    Merci de vos réponses ^^
    • Partager sur Facebook
    • Partager sur Twitter
      8 août 2007 à 19:23:56

      non ceci est l'implémentation, voilà comment il faut faire :
      1. // duree.h
      2. class Duree
      3. {
      4. Duree(int heures = 0, int minutes = 0, int secondes = 0);
      5. };
      6. // duree.cpp
      7. #include "Duree.h"
      8. Duree::Duree(int heures, int minutes, int secondes) : m_heures(heures), m_minutes(minutes), m_secondes(secondes)
      9. {
      10. }
      • Partager sur Facebook
      • Partager sur Twitter
        8 août 2007 à 19:40:54

        C'est ce que je croyais mais le code que j'ai cité plus haut provient du tuto de M@teo21.
        Serait-ce une erreur? :o
        • Partager sur Facebook
        • Partager sur Twitter
          8 août 2007 à 20:00:46

          Oui je confirme ya une belle incohérence dans le cours à ce niveau là !

          Citation : M@teo21 | partie III - chapitre 4 : Nouveautés pour les fonctions


          1. #include <iostream>
          2. using namespace std;
          3. // Prototype avec les valeurs par défaut
          4. int nombreDeSecondes(int heures, int minutes = 0, int secondes = 0);
          5. // Main
          6. int main()
          7. {
          8.     cout << nombreDeSecondes(1, 10, 25) << endl;
          9.     return 0;
          10. }
          11. // Définition de la fonction, SANS les valeurs par défaut
          12. int nombreDeSecondes(int heures, int minutes, int secondes)
          13. {
          14.     int total = 0;
          15.     total = heures * 60 * 60;
          16.     total += minutes * 60;
          17.     total += secondes;
          18.     return total;
          19. }


          Si vous avez lu attentivement ce code, vous avez dû vous rendre compte de quelque chose : les valeurs par défaut sont spécifiés uniquement dans le prototype, PAS dans la définition de la fonction ! On se fait souvent avoir, je vous préviens :p
          Si vous vous trompez, le compilateur vous indiquera une erreur à la ligne de la définition de la fonction.


          :-°

          Il y a donc bien une erreur dans le dernier chapitre sur la surcharge des opérateurs.
          • Partager sur Facebook
          • Partager sur Twitter
          Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.
            8 août 2007 à 20:01:26

            Il s'est légèrement planté dans le tuto sur cette partie ; cf les critiques.
            Le code de minirop est bon.
            • 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.
              8 août 2007 à 20:18:43

              Pour être exact rien n'interdit de mettre des valeurs pas default dans une définition, la seul condition est que l'initialisation des valeur dans la définition ne doit pas rentrer en conflit avec l'initialistation de la déclaration, et j'ai remarqué en testant que si les valeurs par defaut se trouve dans la definition, cette derniere doit suivre la declaration (de la fonction ou de la classe) :
              1. #include <iostream>
              2. int fonction (int, int b = 2);
              3. int fonction (int a = 4, int b)
              4. {
              5.     return a + b;
              6. }
              7. int main()
              8. {
              9.         std::cout << fonction() << std::endl;
              10.         return 0;
              11. }

              Ce code compile parfaitement, par contre si la definition est apres le main sa ne marche plus.
              • Partager sur Facebook
              • Partager sur Twitter
              FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
                8 août 2007 à 20:26:59

                edit : oops..

                je ne savais pas que :
                1. int fonction (int, int b = 2);
                2. int fonction (int a = 4, int b)
                3. {
                4.     return a + b;
                5. }

                était égal à
                1. int fonction (int a = 4, int b = 2)
                2. {
                3.     return a + b;
                4. }

                • Partager sur Facebook
                • Partager sur Twitter
                  8 août 2007 à 20:31:15

                  c'est le contraire
                  • 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.
                    8 août 2007 à 20:43:40

                    Comme la dit Imghs c'est le contraire, et ne me cite pas la ligne suivante, car comme je l'ai écrit les valeurs par défaut de la définition complète celle de la déclaration, donc on final on a :
                    1. int fonction (int a = 4, int b = 2);

                    Les paramètre avec variables sont bien à la fin le code peut s'executer sans problème.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
                      8 août 2007 à 21:21:50

                      La signature peut être raffinée en plusieurs fois pour chaque paramètre au sein d'une portée -- i.e. dans deux portées différentes, on pourrait avoir des valeurs par défaut diférentes.
                      Autant dire que l'on évite et préfère tous les définir dans la déclaration initiale -- et passer sous silence cette étrangeté, histoire de préserver notre santé mentale à tous.

                      (Plus de précisions dans les critiques du 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

                      × 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