1. #1
    Membre du Club
    Profil pro
    Inscrit en
    février 2012
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2012
    Messages : 65
    Points : 50
    Points
    50

    Par défaut signification d'un object constant

    Bonjour je ne comprends pas bien la signification du mot clé const pour un objet dans les paramètre d'une fonctione. Par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Potato
    {
    public:
        int price;
    };
     
    Potato myPotato();
     
    myPotato.price= 5;
     
    void func(const Potato& myPotato)
        return myPotato;
    je peux changer price librement pourtant le passage dans func ne pose pas de problème, Donc ou est la constance dans tout cela ? Y a il un exception pour les const des objets qui signifirait "ne peut pas être modifié dans la fonction seulement " ?

    Merci d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    4 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : février 2005
    Messages : 4 377
    Points : 9 729
    Points
    9 729

    Par défaut

    Bonjour je ne comprends pas bien la signification du mot clé const pour un objet dans les paramètre d'une fonction
    Cela indique juste à l'appelant de la fonction que l'implémentation de la fonction s'engage à ne jamais, directement ou indirectement, changer les champs de l'objet passé en paramètre.

    Le C++ dispose d'un certain nombres de mécanisme pour aider l'implémenteur de la méthode à respecter son engagement.

    C'est le genre de garantie que toute méthode devrait offrir, par défaut, aux codes l'appelant.

    je peux changer price librement
    Oui, parce que "myPotato" est une "Potato", pas une "const Potato".

    pourtant le passage dans func ne pose pas de problème,
    Oui, parce que "func" respect le contrat qui est "de ne pas modifier l'objet passé en paramètre".

    Si "myPotato" était une "const Potato" et que "func" n'avait pas promis, via le modificateur "const" sur le type de paramètre, qu'il ne modifierait pas l'objet passé en paramètre, le compilateur aurait gueulé en disant qu'on ne peut pas faire confiance à "func" pour conserver "myPotato" constante.

    Donc ou est la constance dans tout cela ?
    Dans le "contrat" d'utilisation que donne la signature de func.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 514
    Points : 38 326
    Points
    38 326

    Par défaut

    Attention, ceci ne déclare pas ce que tu crois:
    Plutôt que déclarer un objet construit par défaut, ça déclare une fonction myPotato retournant un objet de type Potato.

    En C++11 (et supérieur), tu peux résoudre l'ambigüité avec la nouvelle syntaxe:
    Code C++11 : Sélectionner tout - Visualiser dans une fenêtre à part
    Potato myPotato{};
    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.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    5 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : août 2004
    Messages : 5 372
    Points : 15 051
    Points
    15 051

    Par défaut

    En fait, il ne faut pas voir const comme signifiant : "Cet objet est constant", mais plus comme : "Depuis ce point d'accès, je ne peux pas modifier cet objet".

    Petit exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int i = 3;
    int const &j = i;
    cout << j << endl; // 3
    // Si j'essaye d'écrire : j = 4; ça ne compile pas
    i = 4;
    cout << j << endl; // 4
    L'objet a changé, mais pas en passant par j.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. E2437 - Constant object cannot be passed as var parameter
    Par RamDevTeam dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 27/07/2009, 16h18
  2. Signification des constantes ?
    Par mlokhia dans le forum Zend Framework
    Réponses: 8
    Dernier message: 10/09/2008, 19h21
  3. Signification de quelques Constantes VB6
    Par AL1986 dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/08/2007, 16h16
  4. signification : constante chaine non terminé
    Par amelhog dans le forum JavaScript
    Réponses: 3
    Dernier message: 19/08/2005, 13h13
  5. Au sujet des constantes
    Par FranT dans le forum Langage
    Réponses: 8
    Dernier message: 09/08/2002, 12h03

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