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 :

retour d'une référence lors de l'appel d'une fonction


Sujet :

C++

  1. #1
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut retour d'une référence lors de l'appel d'une fonction
    Bonjour,

    dans la faq C++, il y a un paragraphe intitulé Que se passe-t-il en cas de retour d'une référence lors de l'appel d'une fonction ?

    Mais a vrai dire je ne suis pas sur de bien comprendre.
    L'exemple donné est celui de l'opérateur Array::operator [](int):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Array {
     public:
       int size() const;
       float& operator[] (int index);
       ...
     };
     
     int main()
     {
       Array a;
       for (int i = 0; i < a.size(); ++i)
         a[i] = 7;    // cette ligne appelle Array::operator[](int)
       ...
     }
    J'aimerais avoir une confirmation si je comprends bien, et quelques précisions si possible.
    si je comprends bien, la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float& operator[] (int index);
    déclare une fonction qui se nomme "operator[]", qui prend un entier comme paramètre d'entrée, et qui retourne une référence sur un float?

    Bon, ensuite quand on écrit a[i], c'est comme si on avait écrit a.operator[](i) je suppose...

    alors "a[i]" est remplacé par la valeur de retour de la fonction, soit une référence (qui est une référence sur la ième valeur contenue dans a, ce qui nous permet de la modifier par le "= 7" puisqu'en modifiant une référence, on modifie le référent!)

    Est-ce bien ça qui se passe?

    merci

  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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    C'est bien ça.

  3. #3
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Et bien je pense que tu as tout compris... je ne vois même pas quoi ajouter de plus

    si je comprends bien, la ligne
    Code:
    float& operator[] (int index);

    déclare une fonction qui se nomme "operator[]", qui prend un entier comme paramètre d'entrée, et qui retourne une référence sur un float?
    Exactement, les opérateurs sont en quelques sortes des fonctions qui permetent une ecriture plus intuitive comme a = b plutot que a.egal(b).

    Bon, ensuite quand on écrit a[i], c'est comme si on avait écrit a.operator[](i) je suppose...
    C'est ça...

    alors "a[i]" est remplacé par la valeur de retour de la fonction, soit une référence (qui est une référence sur la ième valeur contenue dans a, ce qui nous permet de la modifier par le "= 7" puisqu'en modifiant une référence, on modifie le référent!)

    Est-ce bien ça qui se passe?
    oui
    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  4. #4
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut
    Merci pour vos réponses, mais il y a encore un truc que je ne pige pas: les opérateurs ++ (préfix et postfix)

    Il sont déclarés, selon la faq:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Number {
       public:
          Number& operator++ ();    // prefix ++
          Number  operator++ (int); // postfix ++
    };
    or je comprends bien qu'on puisse remplacer
    y = i++; par y = i.operator++();

    mais je ne vois pas par quoi remplacer
    y = ++i;

    ???

    ça donnerais selon moi un truc du genre:
    y = .operator++(i);

    mais la j'y comprends plus rien?

  5. #5
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Oui, il faudrait passer un entier en paramètre pour appeler l'opérateur d'incrémentation postfixé. Mais ne te focalise pas sur ça, l'entier reçu en paramètre n'est qu'une bidouille du langage pour distinguer les deux formes d'incrémentation.

    PS : tu mélanges postfixe et préfixe dans tes exemples.

  6. #6
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut
    OK merci pour cette précision. Je ne vais en effet pas me focaliser la dessus (pour l'instant en tout cas )

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

Discussions similaires

  1. Utilisation d'une variable lors de l'appel de la fonction
    Par guy16 dans le forum Général Python
    Réponses: 18
    Dernier message: 12/05/2015, 15h47
  2. Réponses: 11
    Dernier message: 10/10/2014, 14h54
  3. Réponses: 3
    Dernier message: 08/10/2014, 15h48
  4. Réponses: 5
    Dernier message: 28/04/2010, 14h54
  5. [Language]problème lors de l'appel d'une méthode
    Par Samanta dans le forum Langage
    Réponses: 6
    Dernier message: 18/05/2005, 13h03

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