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 :

[POO] Méthodes virtuelles const ?


Sujet :

C++

  1. #21
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Le role d'une méthode const est de préciser au compilateur "cette méthode ne modifie pas l'objet".
    Et surtout à l'utilisateur

  2. #22
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Je dirais même au développeur

  3. #23
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Et surtout à l'utilisateur
    En fait, non...

    La valeur d'une fonction constante pour l'utilisateur est - effectivement - purement informative.

    Tu peux en effet très bien envisager d'appeler une méthode constante sur un objet qui ne l'est pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void foo()
    {
        /* création d'un objet non constant */
        std::vector<Type> tab;
        /* utilisation d'une méthode constante sur... un objet non constant */
        if (tab.size()!=0)
        {
            /*...*/
        }
    }
    se voit de manière très commune...

    Par contre, c'est si l'objet est constant que cela se corse:

    Le compilateur refusera tout appel à une méthode qui ne se sera pas engagée (par sa signature constante) à ne pas modifier l'objet, et cela fait force de loi pour lui.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void bar(const std::vector<Type>& tab)
    {
       /* tab est un objet constant */
        tab.push_back (/*...*/ ) /* Refusé: push_back ne s'est pas engagée
                                  * à ne pas modifier l'objet
                                  */
        if(tab.size() == 0) // accepté : size() est une méthode constante
        {
            /*...*/
        }
    }
    La déclaration d'une méthode constante s'adresse donc bien en priorité au compilateur
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #24
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct Titi {
        void change();
    };
    struct Toto {
       void f() const { 
          m_p -> change();
       }
    private:
       Titi * m_p;
    };
    Le compilo vérifie des choses avec le const, mais c'est bien avant tout une précision sur l'état visible, donc qui concerne plus l'utilisateur qu'autre chose.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #25
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par koala01 Voir le message
    En fait, non...

    La valeur d'une fonction constante pour l'utilisateur est - effectivement - purement informative.
    Quand je dis que c'est pour le développeur, c'est que j'ai mes raisons
    Je renvoie à ce que Herb Sutter dit du mot-clé const, et je suis d'accord avec lui. C'est surtout pour empêcher le développeur de faire n'importe quoi. Mais derrière, le compilateur ne va pas activer des optimisations spécifiques, parce qu'il ne peut pas, à cause des mutable, des pointeurs vers les classes, ...

  6. #26
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Il peut en activer certaines quand une fonction const est définie inline, bien sûr.

    Ensuite, je pense qu'on doit pouvoir régler le compilo pour qu'il suppose que les fonctions membres const ne font pas de const_cast, permettant des optimisations pour les membres ni pointeurs ni mutables. Si le "Assume no aliasing" existe, une telle option doit exister aussi...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #27
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Pas encore trouvé cette option alors, et pourtant, j'ai scanné pas mal d'options de compilateurs ces dernières semaines.
    const ou pas const, s'il constate que tout le code est const, il va faire les mêmes choses, les mêmes optimisations. Donc c'est vraiment au développeur de faire attention à bien différentier les deux si le besoin s'en fait sentir.

  8. #28
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Il peut en activer certaines quand une fonction const est définie inline, bien sûr.
    Et rien n'empeche de faire les memes si la fonction n'est pas const, il doit faire exactement les memes controles.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 14
    Dernier message: 21/11/2008, 17h29
  2. Méthodes virtuelle et implémentation
    Par slate dans le forum C++
    Réponses: 2
    Dernier message: 16/02/2006, 18h16
  3. méthodes virtuelles
    Par ep31 dans le forum C++
    Réponses: 2
    Dernier message: 09/11/2005, 18h21
  4. Comment l'appel à une méthode virtuelle....
    Par Blobette dans le forum C++
    Réponses: 7
    Dernier message: 07/12/2004, 14h55
  5. [C#] Méthode virtuelle
    Par jacma dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/11/2004, 09h18

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