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 :

[debutant] le mot clé const


Sujet :

C++

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut [debutant] le mot clé const
    Bonjour à tous,

    voilà, je me rend compte que j'ai de grosses lacunes concernant le mot clé const. Il peut être utilisé de différentes façons, et je m'embrouille un peu. Aussi, je me disais que peut-être vous pourrez éclairer ma lanterne.

    Alors voilà, pour commencer, j'ai quelques questions. Pour appuyer mes exemples, j'utiliserai la classe suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Class TestConst
    {
    public:
     TestConst():m_iConst (1),m_iNonConst(2){}
     
    protected:
     const int m_iConst;
     int m_iNonConst;
    };
    Et voici mes questions:
    1/ Dans cette classe, j'ai implémenté la méthode suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void SetConstInt(const int i)	const	{m_iConst = i;}
    Et j'ai une erreur de compilation:
    Citation Envoyé par visual 2005
    error C2166: l-value specifies const object
    Pourquoi?

    2/ A quoi sert, concrètement, ce mot clé const? Quelles en sont ses différentes utilisations?

    3/ Avez-vous des liens ou de la doc qui explique clairement et précisément l'utilisation de const? Car je n'ai rien trouvé de clair et précis dans tous mes cours de c++.

    Merci
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Salut !

    Je pense que ceci devrait t'éclairer : http://www.developpez.net/forums/sho...ighlight=const

    J'ajouterais une précision, pour les méthodes membres spécifiées constantes (ne modifiant pas l'instance), la constance est automatiquement transférée au données membre de l'instance en cours pour détecter les infractions à la constance.
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Le compilateur n'accepte pas l'affectation d'une valeur à une constante hors initialisation:
    est bon mais pas:
    De plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void SetConstInt(const int i)	const
    Donc la fonction n'est pas sensée modifier l'instance de la classe.

    Donc il faut initialiser la constante avec un constructeur qui ne peut pas être "const".
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut


    Après quelques tests et surtout grâce à vos conseils et vos liens, je crois que je suis maintenant au point. C'était nettement plus simple que ce que je pensais

    Encore
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Ha, une dernière question:
    Imaginons que j'ai une classe qui a besoin de constantes. Comme par exemple, une classe qui effectue des calculs de mécanique et qui a besoin d'une constante g=9.81.

    1/ Quelle est la meilleure solution parmi les suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //MaClasse.cpp
    #define g 9.81 //define et variable globale
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //MaClasse.h
    [...]
    private:
      const float g = 9.81;//variable membre contante
    [...]
    Y-a-til mieux?

    2/ Quels sont les "chartes de nommage" communément admises pour les variables const?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  6. #6
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    personnellement, j'aurais plutôt tendance à faire une variable static const dans la classe... en C++, toujours éviter les instruction préproc au maximum...

    pour les chartes de nommages je ne pourrais pas te renseigner par contre, désolé...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Pour définir une variable static constante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A{
    private:
          static const int g;
     
          };
    const int A::g=9.81;
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  8. #8
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Argh, je viens de tomber sur un os:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef std::vector<CMonObjet*> MonObjetList;
    class Toto
    {
    public:
    [...]
        MonObjetList* GetMonObjetList() const {return &m_MonObjetList;}
     
    protected:
        MonObjetList m_MonObjetList;
    };
    Ce code génère l'erreur de compilation suivante:
    error C2440: 'return' : cannot convert from 'const class std::vector<class CMonObjet *,class std::allocator<class CMonObjet *> > *' to 'class std::vector<class CMonObjet *,class std::allocator<class CMonObjet *> > *'
    Alors que:
    1/ si j'enlève le const, ça marche
    2/ le const_cast est implicite, donc normalement, bien que m_MonObjetList ne soit pas déclaré comme const, il doit être implicitement casté.
    3/ je ne comprends pas cette erreur

    Que se passe-t-il?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  9. #9
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    du fait que ta méthode soit déclaré comme const, m_MonObjetList est un const MonObjetList donc &m_MonObjetList est un const MonObjetList*

    or si la conversion A* => const A* est implicite, la conversion const A* => A* est interdite.

    il faut déclarer ta fonction comme renvoyant un const MonObjetList
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  10. #10
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Haaaa d'accord.
    Mais là, ça ne me conviens pas! (je sais, je suis c****t ). Ce que je voudrais, c'est de m'assurer que cette méthode ne modifie pas la classe (donc une méthode const) mais qui renvoie un objet que je puisse modifier de l'extérieur de cette classe. Dois-je utiliser le mot clé mutable?

    Je ne sais pas pourquoi, j'ai l'impression qu'il y a quelque chose qui cloche dans mon histoire
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  11. #11
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Je pense qu'il ne faut pas que tu déclares cette fonction comme constante, parce que tu ne peux pas assurer que ta classe ne sera pas modifiée suite à son utilisation.

  12. #12
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    la fonction en elle même ne fait que retourner un pointeur, elle ne pourra jamais modifier les données membres de la classe en elle-même...

    Cependant, donner un pointeur sur une donnée membre peut être dangeureux pour plusieurs raisons (pointeurs fantômes, modifications "ex-nihilo" de l'instance etc...)

    donc soit tu dis que ta fonction n'est pas const, soit tu reçoit un pointeur const

    ensuite, si la sémantique le justifie VRAIMENT tu peux aussi utiliser un const_cast, mais la plupart du temps, ça implique une erreur de modélisation
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  13. #13
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Je pense, en effet, qu'il y a une erreur de modélisation dans mon appli. Rien qu'à voir le diagramme UML... il commence à ressembler à un plat de spaghettis, cela ne présage rien de bon.
    Je vais revoir un peu ça, ça tombe bien, j'ai du temps en ce moment
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

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

Discussions similaires

  1. Réponses: 56
    Dernier message: 17/08/2008, 22h56
  2. Réponses: 14
    Dernier message: 25/10/2007, 15h00
  3. [debutant][Access2003]Mot de passe
    Par jerem78 dans le forum Access
    Réponses: 9
    Dernier message: 19/06/2006, 11h05
  4. [DEBUTANT]Recherche mot contenu dans une String
    Par lynxman dans le forum Langage
    Réponses: 7
    Dernier message: 16/12/2005, 11h49
  5. [langage] recherche de début de mot
    Par yanndan dans le forum Langage
    Réponses: 3
    Dernier message: 17/03/2005, 18h25

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