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 :

mot cle const


Sujet :

C++

  1. #1
    Membre averti Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Points : 382
    Points
    382
    Par défaut mot cle const
    bonjour,

    je voudrais savoir si le mot cle const utilise dans les methodes de classe est necessaire ou facultatif au bon fonctionnement de celle ci .

    ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Nom_de_classe operator+(const Nom_de_classe &)
    est ce que le mot cle const est necessaire ?

    voila j'espere avoir ete claire dans ma question

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Points : 32
    Points
    32
    Par défaut
    Ce n'est pas une obligation mais c'est plus safe car ça t'oblige à ne pas modifier le deuxième opérande. Lors de l'utilisation de l'opérateur +, on ne s'attend pas à ce que la deuxième opérande soit modifiée.

  3. #3
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par zouip Voir le message
    Ce n'est pas une obligation mais c'est plus safe car ça t'oblige à ne pas modifier le deuxième opérande
    Pas forcément, ici on peut modifier la variable passée en paramètre sans souci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nom_de_classe operator+(Nom_de_classe)
    Pour simplifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Nom_de_classe operator+(Nom_de_classe c);             // Passage par recopie : [in]
    Nom_de_classe operator+(Nom_de_classe &c);            // Passage par référence : [in] et/ou [out]
    Nom_de_classe operator+(const Nom_de_classe &c);      // Passage par référence constante : [in]
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par babar63 Voir le message
    Pas forcément, ici on peut modifier la variable passée en paramètre sans souci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nom_de_classe operator+(Nom_de_classe)
    Justement, là tu n'a pas mis le mot clef const dans le passage par référence...

  5. #5
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par elmcherqui
    est ce que le mot cle const est necessaire ?
    Citation Envoyé par zouip
    Ce n'est pas une obligation mais c'est plus safe
    Ce que je voulais dire c'est qu'on est pas obligé d'utiliser const pour rester "safe", on peut aussi passé le paramètre par recopie... il faut juste faire la distinction entre les trois cas de figures :
    Pour les types prédéfinis il est "préférable" de passer par recopie.
    Sinon il est "préférable" de passer par référence et dans ce cas si on ne souhaite pas modifier le paramètre alors il faut utiliser const
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Points : 32
    Points
    32
    Par défaut
    Okay on est sur la même longueur d'onde

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par babar63 Voir le message
    Ce que je voulais dire c'est qu'on est pas obligé d'utiliser const pour rester "safe", on peut aussi passé le paramètre par recopie... il faut juste faire la distinction entre les trois cas de figures :
    Pour les types prédéfinis il est "préférable" de passer par recopie.
    Sinon il est "préférable" de passer par référence et dans ce cas si on ne souhaite pas modifier le paramètre alors il faut utiliser const
    Mais effectuer un passage par valeur peut poser un sérieux problème de performance. En fait l'idéal serait de toujours faire un passage par référence constante dans le cas général et de ne faire des copies que dans des cas contrôlés.

    Le const assure qu'on ne change pas la valeur à l'intérieur de la fonction de manière statique. C'est donc mieux encore que le passage par valeur d'après moi (comprendre « plus sûr »).

  8. #8
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    Mais effectuer un passage par valeur peut poser un sérieux problème de performance. En fait l'idéal serait de toujours faire un passage par référence constante dans le cas général et de ne faire des copies que dans des cas contrôlés
    Pourquoi toujours? Passer des int, float,... par références améliore les performances? Pour ma part j'utilise ce système excpeté pour quelques éxceptions très particulières :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Nom_de_classe operator+(Nom_de_classe c);             // Passage par recopie [in], type prédéfini
    Nom_de_classe operator+(Nom_de_classe &c);            // Passage par référence : [out] ou [in]/[out], type personnalisé
    Nom_de_classe operator+(const Nom_de_classe &c);      // Passage par référence constante : [in] type personnalisé
    Ca ne couvre pas tous les cas mais les plus communs je pense...
    Citation Envoyé par Garulfo
    Le const assure qu'on ne change pas la valeur à l'intérieur de la fonction de manière statique. C'est donc mieux encore que le passage par valeur d'après moi (comprendre « plus sûr »)
    Pour moi le const est utilisé pour associer une propriété à une donnée et non comme un moyen plus sûr, il permet une meilleur lecture du code, (d'ailleurs si je ne me trompe pas le compilateur apprécie aussi ) ... Mais ça c'est une question de point de vue je suppose
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par babar63 Voir le message
    Pour moi le const est utilisé pour associer une propriété à une donnée et non comme un moyen plus sûr, il permet une meilleur lecture du code, (d'ailleurs si je ne me trompe pas le compilateur apprécie aussi ) ... Mais ça c'est une question de point de vue je suppose
    Quand je fais un const pour un passage par référence, c'est toujours dans un soucis de sécurité. Même si le code de ta fonction est simple, il peut modifier la référence sans que tu t'en rende compte au premier abord, ce qui peut avoir des répercussions désastreuses sur le reste du programme. Mettre ce mot clef const, c'est se forcer à respecter les règles qu'on s'est soit même imposé, ça évite aussi de passer des heures à débugger

  10. #10
    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
    Bon il y a deux débat différents.

    Pour ce qui est du passage par valeur Vs référence constante :
    On se trouve dans une situation où l'on a besoin d'un objet en lecture, sans qu'il se retrouve modifié après l'appel de la fonction. Il a déjà été dit que les types dont la taille est supérieure à celle d'un pointeur au moment de la compilation doivent préférer le passage par référence constante. Tous les autres (la plupart des types primitifs en l'occurence) doivent préférer le passage par valeur. La raison est simple : il est parfois plus rapide de recopier l'adresse d'un objet plutôt que l'objet lui même, par contre, si l'on passait un int par référence constante dans un système qui utilise les int pour représenter les pointeurs, on aurait aucun gain ni perte pour la recopie, mais lors de l'accès, il y aurait toujours une indirection du fait de manipuler une adresse, donc moins intéressant.

    Pour le mot clef const :
    On l'utilise simplement lorsque, après un appel à la fonction, il ne serait pas logique de se retrouver avec un objet dont l'état a changé, point. Evidemment c'est plus sûr dans le sens où la personne qui écrit le corps de la fonction est limitée aux appels des méthodes déclarées const sur l'objet. Malheureusement, il n'existe aucune véritable garantie que l'objet n'est pas été modifié par la fonction (const_cast ou autre). De ce fait, le compliateur n'optimise rien du tout (désolé babar63).
    C'est tout à fait vrai que le mot clef const améliore la lecture. Pour l'utilisateur de la fonction, il donne déjà des indications sur ce que fais la fonction (je vais modifier cet objet, pas celui là etc.).

    Le mot clef n'est pas nécessaire pour un passage par valeur. L'objet passé est un temporaire, détruit après l'appel. Il peut donc être modifié librement.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Un petit détail au passage sans trop m'immiscer dans le débat:
    dans le cas présenté au premier post, l'opérateur + devrait être lui aussi déclaré const, parce que c'est le fonctionnement attendu dans ce type d'opérateur, il ne devrait jamais modifier ni l'instance à gauche ni l'instance à droite de l'opérateur et se contenter de renvoyer une valeur.

  12. #12
    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
    Il devrait ne pas être membre de la classe surtout...

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Points : 32
    Points
    32
    Par défaut
    Effectivement, dans le cas présenté au premier post, il aurait été préférable de faire une surchage externe de l'opérateur +

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class A {
         friend A operator+(const A&, const A&);
         /* ... */
    };
     
    A operator+(const A& operande_a, const A& operande_b){
       /* ... */
    }

  14. #14
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    En effet. Pour la plupart des opérateurs binaires (tous ?), il vaut mieux le définir à l'extérieur de la classe concernée.

    Pourquoi ?

    Parce que dans la plupart des cas, il n'y a aucune raison de privilégier l'une ou l'autre des opérandes.

    C'est à dire :
    doit plutôt s'interpréter comme
    que comme

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Bah je ne vois pas pourquoi, si l'opérateur entre dans la conception de la classe ça fonctionne aussi bien, et c'est tout aussi clair.

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Points : 32
    Points
    32
    Par défaut
    Ca fonctionne tout aussi bien, mais ça n'est certainement pas plus clair.
    L'opérateur + est en théorie symétrique, ce qui est incohérent avec la surcharge interne de cet opérateur.

  17. #17
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    C'est ce que j'ai essayé de dire, oui, désolé si je n'ai pas été clair.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par zais_ethael Voir le message
    Bah je ne vois pas pourquoi, si l'opérateur entre dans la conception de la classe ça fonctionne aussi bien, et c'est tout aussi clair.
    Simplement parce que l'opérateur intervient généralement (ou en tout cas peut intervenir) dans la partie droite d'une expression plus complexe qui a pour but d'affecter la valeur résultante à une troisième variable, sans pour autant vouloir modifier le premier opérande.

    Les opérateurs mathématiques sont en effet susceptibles d'intervenir dans des expressions du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    c = a + b ;
    c = a - b ;
    c = a * b;
    c = a / b;
    alors que tu veux peut être garder la valeur originale de a

    Si tu souhaite modifier effectivement la valeur de a, le fait d'avoir l'opérateur défini à l'extérieur de la classe ne posera pas de problème d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a = a + b;
    a = a - b;
    a = a * b;
    a = a / b;
    mais, tu préféreras sans doute utiliser les opérateurs +=, -=,*= ou /=, qui seront, eux, défini au sein de la classe
    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

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Si je me souviens de mes vieux cours mon prof nous avait simplement expliqué que déclarer un opérateur dans la classe obligeait à placer la seconde opérande à droite de l'instance courante, ça m'a largement suffit pour comprendre le fonctionnement et je ne suis jamais étonné du comportement d'un opérateur. Il ne faut pas être un gourou en la matière pour ne jamais faire d'erreur d'interprétation du code.
    Aussi je suis un peu étonné de vous voir prêcher comme un vérité quelque chose qui n'est jamais que... très subjectif.
    Par contre vous avez complètement éclipsés ma remarque sur la constance de l'opérande de gauche ce qui est tout de même un peu plus important (car ça ça change la sémantique).

  20. #20
    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 519
    Points
    41 519
    Par défaut
    Attention, un opérateur + ne doit pas modifier le membre de gauche.
    Donc, si on en fait une fonction membre:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class A
    {
    public:
    	...
    	A operator+ (A const &right) const;
    };
    
    A A::operator+ (A const &right) const
    {
    	...
    }
    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.

Discussions similaires

  1. [debutant] le mot clé const
    Par r0d dans le forum Débuter
    Réponses: 12
    Dernier message: 21/06/2006, 16h13
  2. Recherche par mots cles
    Par Seth77 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2006, 15h58
  3. [deb]Mot cle tyledef complement d'info
    Par Marc_3 dans le forum C++
    Réponses: 9
    Dernier message: 11/12/2005, 22h12
  4. [Mots cles]Signification de transient et volatile
    Par Pill_S dans le forum Langage
    Réponses: 2
    Dernier message: 14/07/2004, 11h58

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