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

Langage C++ Discussion :

Mot clé Const placé à la fin d'une déclaration de fonction


Sujet :

Langage C++

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Informatique Senior
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Informatique Senior

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 65
    Points
    65
    Par défaut Mot clé Const placé à la fin d'une déclaration de fonction
    Bonjour,
    Que signifie le mot clé "const" lorsqu'il est placé à la fin d'une déclaration/définition d'une fonction comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void my_fct ( void ) const ;
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void my_fct ( void ) const {
    };

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Déjà, ce const ne s'applique que à des fonctions membres de classe. Je ne pense pas qu'il puisse s'appliquer à des fonctions libres (comprendre à des fonction non membres de classe).

    Ce const signifie que la fonction membre ne modifie pas les variables membres de la classe. L'état de l'instance est laissé inchangé.

    Typiquement, on trouve sont utilisation dans les getter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MaClasse
    {
    public :
          ...
          int GetAttribute(void) const { return m_attribute; }
          void SetAttribute(int Val) { m_attribute = val; }
    
    private:
       int m_attribute;
    }
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Informatique Senior
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Informatique Senior

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 65
    Points
    65
    Par défaut Mot clé const
    Merci "ram-0000 " pour la réponse

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par ali.ensi Voir le message
    Merci "ram-0000 " pour la réponse
    De rien mais c'est encore mieux avec le bouton
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Ce const signifie que la fonction membre ne modifie pas les variables membres de la classe. L'état de l'instance est laissé inchangé.
    Ca sert surtout (uniquement?) à s'assurer que la méthode puisse être appelée sur une instance const (et donc respecter le const-correctness).

    Les méthodes déclarées avec const peuvent modifier leurs membres si besoins (ceux-ci doivent être mutable). L'aspect constant est plus de l'ordre logique que réellement un figeage de l'état "bit à bit" de l'objet.

  6. #6
    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 612
    Points
    30 612
    Par défaut
    Salut,
    Citation Envoyé par ram-0000 Voir le message
    Déjà, ce const ne s'applique que à des fonctions membres de classe. Je ne pense pas qu'il puisse s'appliquer à des fonctions libres (comprendre à des fonction non membres de classe).
    Je confirme...

    La raison est simple: le mot clé const signale que la fonction membre s'engage à ne pas modifier l'objet au départ duquel elle est appelée...

    Une fonction libre n'a donc strictement aucun intérêt à admettre le const-qualifier dans cette optique, vu que, en toute logique, elle ne fait partie d'aucun objet

    Par contre, tu es beaucoup trop restrictif en ne citant que les "getters" comme cas typique...

    J'aurais plutôt dit qu'on la trouve typiquement lorsque... une fonction n'a pas besoin de modifier l'objet au départ duquel elle est appelée.

    Cela va, et sans espérer être exhaustif, du getter "simple" à une fonction membre qui devrait envoyer les données de l'objet vers un flux, en passant par toutes les fonctions permettant d'obtenir l'état de l'objet (le terme "état" étant pris ici dans son sens le plus large, et pouvant être calculé) ou celles qui sont destinées à "parcourir" l'objet (lorsqu'il entre dans une logique impliquant d'autres membres similaires)

    Deux autres points importants sont à signaler:
    1. une fonction membre déclarée constante ne pourra appeler que d'autres fonctions membres déclarées constante

      avec un objet non constant
    2. Si une fonction membre constante peut être appelée depuis un objet non constant, une fonction membre non constante ne peut pas être appelée depuis un objet constant.


    Ainsi, si on a une classe proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class MaClass
    {
        public:
            doSomething() const;
            someOtherConstOperation() const;
            doNoConstOperation();
    };
    doSomething ne peut appeler que someOtherConstOperation (et inversément) mais aucune des deux ne peut appeler doNoConstOperation.

    Avec un objet non constant, nous pourrons écrire un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main()
    {
        MaClass c;
        c.doSomething(); /* OK appel d'une fonction constante depuis un objet
                         * non constant
                         */
        c.doNoConstOperation() /* OK apel d'une fonction non constante
                              * depuis un objet non constant
                              */
    }
    Et, avec un objet constant, nous serons dans la situation suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main()
    {
        MaClass const c;
        c.doSomething(); /* OK appel d'une fonction constante depuis un objet
                         * constant
                         */
        /* la ligne suivante sera refusée à la compilation */
        c.doNoConstOperation() /* !!! KO !!! apel d'une fonction non constante
                              * depuis un objet constant
                              */
    }
    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

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Par contre, tu es beaucoup trop restrictif en ne citant que les "getters" comme cas typique...
    <Mode attribute="HS">
    Panne d'inpiration, c'est l'été
    </Mode>


    autorisation de virer ce message
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

Discussions similaires

  1. [XL-2010] Date de début/fin dans une liste en fonction d'une période
    Par beloquinto dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 25/02/2014, 00h07
  2. Réponses: 1
    Dernier message: 14/01/2011, 13h46
  3. Question sur une déclaration de fonction
    Par deubelte dans le forum Débuter
    Réponses: 2
    Dernier message: 08/03/2010, 10h13
  4. Mot clé const à la fin d'une méthode?
    Par JDamien.LE dans le forum Débuter
    Réponses: 1
    Dernier message: 25/02/2010, 08h27
  5. Réponses: 56
    Dernier message: 17/08/2008, 22h56

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