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 :

Pointeurs et références constantes


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Pointeurs et références constantes
    Bonjour à tous,

    Voici la fonction suivante qui recois une variable int "i", et qui la retourne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int returnArg(int i)
    {
    return i;
    }
    Comme la fonction ne modifie l'argument i, on peut la rendre constante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int returnArg(const int i)
    {
    return i;
    }
    Si cette fonction était placé dans une classe, comme elle ne fait pas appelle aux variable membre et donc ne les modifies pas, on en arrive à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int returnArg(const int i) const
    {
    return i;
    }
    Jusque là je saisi tout, mais quand on fait usage à un pointeur ou une référence, comment s'y prendre, pour :
    -Ne pas modifier l'adresse du pointeur ou ne pas modifier la référence
    -Ne pas modifier la valeur du pointeur ou de la référence

    J'ai déjà vu quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int returnArg(const int* i const) const
    {
    return i;
    }
    Mais je ne serais pas vraiment le définir... Merci à ceux qui sauront m'éclaircir d'avantage.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Le mot-clé const qualifie le type qui le précède (et quand il est placé au début, on peut intervertir pour retomber sur cette règle).

    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int const i; // entier constant
    int const * i; // pointeur sur entier constant (tu ne peux pas modifier *i)
    int * const i; // pointeur constant sur entier (tu ne peux pas modifier i)
    int const & i; // référence sur un entier constant (tu ne peux pas modifier *i)
    int * const * const i; // pointeur constant sur pointeur constant sur entier (tu peux modifier **i, mais pas *i ni i)
    etc.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Il faut préciser quelques points :
    -un reference fait toujours "référence" au même objet. Ce code devrait donc au moins provoquer une warning si ce n'est une erreur:
    -const s'applique à ce qui est just devant lui(et seulement à défaut ce qui est après lui). Le code :
    fonctionne car il n'y a rien devant le const.
    -donc dans le cas des pointeur et des reference il y a 6 possibilités:
    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
    19
    20
    21
    22
    23
    24
     
    int i1 = 0,i2 = 0;
    int& r = i1; // r fait reference à i1
    r=i2;         // r fait toujours reference à i1; i=r=0
     
    int const& rc = i1; // rc fait reference à i1
    rc=i2;         // erreur, rc fait reference à un entier constant
     
    int* p = &i1; // p fait reference à i1
    *p=i2;         // p fait toujours reference à i1; i=*p=0
    p=&i2;        // p fait reference à i2
     
    int const* pc = &i1; // pc fait reference à i1
    *pc=i2;                 // erreur, pc fait reference à un entier constant
    pc=&i2                   // ok, pc fait reference à i2
     
     
    int *const cp = &i1; // cp fait reference à i1
    *cp=i2;           // cp fait toujours reference à i1; i=*p=0
    cp=&i2;           //  erreur, cp est un pointeur constant
     
    int const *const cpc = &i1; // cpc fait reference à i1
    *cpc=i2;             // erreur, cpc fait reference à un entier constant
    cpc=&i2;             //  erreur, cpc est un pointeur constant

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci pour vos réponses,
    Citation Envoyé par Laurent Gomila Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int const * i; // pointeur sur entier constant (tu ne peux pas modifier *i)
    Est ce que ça revient à la même chose que :

    Le keyword const peut-être placé devant ou après le type qu'il qualifie à ce que j'ai compris, mais je trouve pas ça très logique... il risque d'y avoir confusion non ?

    J'ai pas compris cette ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r=i2;         // r fait toujours reference à i1; i=r=0
    C'est quoi i ? i1 ou i2 ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    i1 et i2 ce sont deux entiers déclarés au debut du code et i, c'est une erreur de frappe pour i1.
    Ce code est invalide car const ne peut pas qualifier un nom de variable ("i"). Il faut que const soit juste après(éventuellement avant) ce qu'il qualifie, sans qu'il en soit séparé par des caractères(hors espaces, tabulations, retour à la ligne)

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Le keyword const peut-être placé devant ou après le type qu'il qualifie à ce que j'ai compris, mais je trouve pas ça très logique... il risque d'y avoir confusion non ?
    Seulement lorsqu'il qualifie le tout premier type de l'expression, donc il n'y a aucune confusion possible.

    C'est quoi i ? i1 ou i2 ?
    C'était juste pour illustrer le fait que modifier une référence modifie directement la variable originale.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    C'était juste pour illustrer le fait que modifier une référence modifie directement la variable originale.
    Alors pourquoi dans le code suivant, r fait toujours référence à i1 et non à i2 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i1 = 0,i2 = 0;
    int& r = i1; // r fait reference à i1
    r=i2;         // r fait toujours reference à i1; i1=r=0

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Parce qu'une référence est "liée" à une variable au moment de sa déclaration et uniquement à ce moment là. Tout ce qui se passe ensuite, y compris les affectations, sont transmises à la variable liée. On ne peut pas lier une référence à autre chose en cours de route, contrairement aux pointeurs.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Explique moi alors ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <iostream>
     
    int main()
    {
    	int i = 5;
    	int &r = i;
    	int i2 = 7;
    	r = i2;
    	std::cout << "Valeur de i2 :" << i2 << " - i: " << i << " - r : " << r << "\n"; 
    	return 0;
    }
    Out : Valeur de i2 :7 - i: 7 - r : 7

    r est bel est bien modifier...

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ce que tu fais là c'est que tu assignes la valeur de i2 à r (donc à i, qui ne vaut alors plus 5). Tu ne fais pas "pointer" r vers i2.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Tout est compris, merci à vous ! Sujet résolu.
    Dernière modification par Invité ; 26/04/2010 à 13h03.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/03/2015, 11h12
  2. Pointeur sur référence ?
    Par koala01 dans le forum C++
    Réponses: 24
    Dernier message: 15/01/2008, 17h54
  3. renvois de référence constantes.
    Par castorus dans le forum C++
    Réponses: 6
    Dernier message: 04/06/2007, 17h35
  4. pointeur ou référence
    Par damien77 dans le forum C++
    Réponses: 2
    Dernier message: 23/03/2007, 16h43
  5. Réponses: 10
    Dernier message: 03/03/2005, 13h36

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