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 :

Question const sur pointeur


Sujet :

C++

  1. #1
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut Question const sur pointeur
    Bonjour,

    j'ai une fonction de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fun(MA_STRUCT * const Panne){
     
    *Panne = VAR;
    }
    MA_STRUCT est un type struct (surprenant, n'est-ce pas ?), et VAR une structure par défaut.

    Le const signifie que le pointeur d'adresse ne sera pas modifié, mais que les valeurs à l'adresse pointée peuvent être modifiée, c'est bien ça ?

    Merci.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    A titre de comparaison :

    const T* p <=> std::unique_ptr<const T>.
    T* const p <=> const std::unique_ptr<T>.

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Type * const nom; Se lit pointeur constant sur un Type. Donc le pointeur est constant (on ne peut pas modifier sa valeur) contrairement à l'objet pointé.

    const Type * nom; Se lit pointeur sur un Type constant. Le pointeur pourra donc être modifié contrairement à l'objet pointé qui est considéré comme constant et qui ne pourra pas être modifié par le biais de ce pointeur.

  4. #4
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    Je me permettrai d'ajouter qu'il faudrait ajouter un gros panneau attention devant cette déclaration, parce que, justement, elle exploite un point assez méconnu de la norme. Et que mettre le pointeur const ne sert ici strictement à rien pour l'appelant.

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Un petit rappel concernant le mot clé const :

    D'après la norme, il s'applique à ce qui se trouve à sa gauche, sauf (il s'agit donc bel et bien d'une exception à la règle ) s'il n'y a rien à sa gauche, auquel cas il s'applique à se qui se trouve à sa droite

    Quand ont déclare un pointeur, il y a donc quatre possibilités:
    1. Type * ptr un pointeur non constant sur vers un objet non constant de type Type : on peut aussi modifier l'adresse contenue par le pointeur (comprendre : le faire pointer sur un autre objet) que modifier l'objet pointé par le pointeur
    2. Type * const ptr un pointeur constant sur vers un objet non constant de type Type : on ne peut pas faire pointer le pointeur sur un autre objet, mais on peut, en revanche, modifier l'objet pointé
    3. Type * ptr const un pointeur non constant sur vers un objet constant de type Type : on peut pas faire pointer le pointeur sur un autre objet, mais on ne peut pas, en revanche, modifier l'objet pointé
    4. Type * const ptr const un pointeur constant sur vers un objet constant de type Type : on ne peut ni faire pointer le pointeur vers un autre objet, ni modifier l'objet pointé
    Par exception à la règle, il existe deux autres possibilités:
    1. const Type * ptr un pointeur constant sur vers un objet non constant de type Type : on ne peut pas faire pointer le pointeur sur un autre objet, mais on peut, en revanche, modifier l'objet pointé
    2. const Type * ptr const un pointeur constant sur vers un objet constant de type Type : on ne peut ni faire pointer le pointeur vers un autre objet, ni modifier l'objet pointé
    hope it helps
    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

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Un petit rappel concernant le mot clé const :

    D'après la norme, il s'applique à ce qui se trouve à sa gauche, sauf (il s'agit donc bel et bien d'une exception à la règle ) s'il n'y a rien à sa gauche, auquel cas il s'applique à se qui se trouve à sa droite

    Quand ont déclare un pointeur, il y a donc quatre possibilités:
    1. Type * ptr un pointeur non constant sur vers un objet non constant de type Type : on peut aussi modifier l'adresse contenue par le pointeur (comprendre : le faire pointer sur un autre objet) que modifier l'objet pointé par le pointeur
    2. Type * const ptr un pointeur constant sur vers un objet non constant de type Type : on ne peut pas faire pointer le pointeur sur un autre objet, mais on peut, en revanche, modifier l'objet pointé
    3. Type * ptr const un pointeur non constant sur vers un objet constant de type Type : on peut pas faire pointer le pointeur sur un autre objet, mais on ne peut pas, en revanche, modifier l'objet pointé
    4. Type * const ptr const un pointeur constant sur vers un objet constant de type Type : on ne peut ni faire pointer le pointeur vers un autre objet, ni modifier l'objet pointé
    Par exception à la règle, il existe deux autres possibilités:
    1. const Type * ptr un pointeur constant sur vers un objet non constant de type Type : on ne peut pas faire pointer le pointeur sur un autre objet, mais on peut, en revanche, modifier l'objet pointé
    2. const Type * ptr const un pointeur constant sur vers un objet constant de type Type : on ne peut ni faire pointer le pointeur vers un autre objet, ni modifier l'objet pointé
    hope it helps
    Euh, y a pas une erreur ici ?
    Ce ne serait pas plutôt :

    • 1. ok
    • 2. ok
    • 3. Type const * ptr
    • 4. Type const * const ptr


    pareil pour les deux autre :

    • 1. const Type * ptr c'est l'inverse ici non, la variable pointée est constante, mais pas le pointeur (donc *ptr = tmp interdit, mais ptr = pointeur autorisé)
    • 2. const Type * const ptr


    Ou alors j'ai loupé quelque chose

  7. #7
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut
    Ok, je suis donc dans le cas 2.

    Merci

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    D'après la norme, il s'applique à ce qui se trouve à sa gauche, sauf (il s'agit donc bel et bien d'une exception à la règle ) s'il n'y a rien à sa gauche, auquel cas il s'applique à se qui se trouve à sa droite
    Désolé de relancer un peu le sujet, mais je m'étonne de cette phrase.

    Le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <windows.h>
    #include <psapi.h>
    #include <iostream>
     
    int f(int const p1, int p2 const)
    {
        return p1 + p2;
    }
     
    int main(void)
    {
        const int a = 2;
        int const b = 3;
     
        int c const = 4; // invalide
     
        return f(a,b);
    }
    génère 2 erreurs.

    Je ne suis pas spécialiste du C++ mais on ne peut utiliser const suivi de rien mais précédé de quelque chose uniquement si ce quelque chose est une méthode, non ?

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 21
    Par défaut
    Salut,
    on ne peut utiliser const suivi de rien mais précédé de quelque chose uniquement si ce quelque chose est une méthode, non ?
    Je ne penses pas qu'on puisse le formuler comme ça non, ne serait-ce que pour la définition de fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void nothing(int const); // Ca compile,mais ce n'est "suivi de rien"
    Il faut surtout que ce qui soit à gauche soit un type, une déclaration de pointeur (*), ou une méthode (pas sur que ce soit le même const que les deux précédents), mais pas le nom de la variable .

    1. int const i;
    2. int * const i;
    3. void MaCLasse::MaMethode() const

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    const s'applique au type qui se trouve à sa gauche (ou, à défaut, à sa droite).
    p2 n'est pas un type.
    int, int*, const int* et int const* sont des types, const peut donc s'y appliquer.

    Quant au const en fin de méthode, il s'applique au this de l'objet sur lequel s'applique la méthode. Si une classe Object définit une méthode const, cela veut dire que cette méthode manipulera un pointeur this de type const Object* const au lieu du type Object* const habituel. Ça veut bien dire ce que ça veut dire : le pointeur this est constant quoiqu'il arrive, mais l'objet qu'il pointe ne l'est pas forcément. Dans le premier cas on précise que l'objet désigné par ce pointeur est lui aussi constant, c'est pourquoi une méthode const ne modifie pas l'état de l'objet.

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Ok merci

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

Discussions similaires

  1. Question basique sur les pointeurs
    Par User Name dans le forum C++
    Réponses: 7
    Dernier message: 30/09/2013, 13h51
  2. questions générales sur pointeurs et classes/objets
    Par membreComplexe12 dans le forum C++
    Réponses: 5
    Dernier message: 09/09/2011, 23h24
  3. Réponses: 7
    Dernier message: 02/01/2008, 14h32
  4. question sur pointeur retourné par malloc()
    Par gauguin dans le forum C
    Réponses: 8
    Dernier message: 21/02/2007, 18h34
  5. Réponses: 4
    Dernier message: 16/11/2006, 02h10

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