Partage
  • Partager sur Facebook
  • Partager sur Twitter

Constructeur d'affectation sans implémentation

    29 août 2018 à 18:30:42

    Bonjour,

    j'ai un peu de mal à comprendre le sens de ce type d'instruction en C++ :

    class MyClass {
    private:
        T val;
    public:
        MyClass(T value) : val(value) {};
    };

    Pourquoi : ?

    Et qu'est-ce que ça fait exactement ?

    Ce symbole n'est-il pas utiliser pour l'héritage ou les conditions ternaire habituellement ?

    Juste une petite question comme ça.

    Je vous remercie :)

    • Partager sur Facebook
    • Partager sur Twitter
    Le doute est le commencement de la sagesse
      29 août 2018 à 18:33:55

      Non, il est utilisé pour initialiser les membres d'une classe ainsi que les classes de base.
      • Partager sur Facebook
      • Partager sur Twitter
        29 août 2018 à 18:42:29

        Une définition de constructeur n'est ni une définition de classe ni une instruction donc ":" est différent en fonction du contexte.
        • Partager sur Facebook
        • Partager sur Twitter
        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
          29 août 2018 à 19:10:30

          Malheureusement...

          Je suis désolé, je ne le fais pas exprès, mais je suis obligé de le dire : "ce cours n'est pas a jour".

          C'est une technique que je vous recommande d'utiliser 
          quand vous le pouvez, c'est-à-dire presque toujours (c'est
          aussi la technique que nous utiliserons dans ce cours).
          
          

          Les recommandations pour ecrire ce code :

          class Personnage
          {
          public:
              Personnage(); //Constructeur
           
          private:
              int m_vie;
              int m_mana;
              std::string m_nomArme;
              int m_degatsArme;
          };
          
          Personnage::Personnage()
          {
              m_vie = 100;
              m_mana = 100;
              m_nomArme = "Épée rouillée";
              m_degatsArme = 10;
          }

          sont en réalité d'ecrire :

          class Personnage
          {
          public: 
              Personnage() = default; // inutile ?
           
          private:
              int m_vie { 100 };
              int m_mana { 100 };
              std::string m_nomArme { "Épée rouillée" };
              int m_degatsArme = 10;
          };

          (Voire ne pas mettre le constructeur par défaut, si on ne déclare que ce conctructeur)

          -
          Edité par gbdivers 29 août 2018 à 19:10:49

          • Partager sur Facebook
          • Partager sur Twitter
            29 août 2018 à 19:40:55

            Salut gbdivers, du coup, comment tu fais quand tu as un constructeur à paramètres? tu n'utilises pas de liste d'initialisation?

            -
            Edité par bxdfr 29 août 2018 à 19:42:31

            • Partager sur Facebook
            • Partager sur Twitter
              29 août 2018 à 20:30:42

              Si, pour les constructeurs a parametres, tu fais comme d'habitude
              • Partager sur Facebook
              • Partager sur Twitter
                29 août 2018 à 20:42:37

                Initialiser les membres en même temps que les déclarer n'est pas incompatible avec un constructeur paramétré: la liste d'initialisation va prendre le pas sur la valeur par défaut.

                Et sinon, la liste d'initialisation n'est pas une technique, mais un moyen d'initialiser les membres. Réaffecter un membre dans le constructeur revient à faire une initialisation en 2 étapes.

                std::string s;
                s = "Hockety pockety wockety wock !";

                Ce qui est à proscrire.

                • Partager sur Facebook
                • Partager sur Twitter
                  30 août 2018 à 8:13:58

                  Une initialisation en deux temps,  qui suppose au passage que la donnée membre considérée a un constructeur par défaut.

                  Ca explique, dans certains cours, la manie de définir des constructeurs par défaut même quand ils n' ont pas de sens.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Constructeur d'affectation sans implémentation

                  × 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