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


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 107
    Points : 48
    Points
    48
    Par défaut retour d'une référence
    Bonjour, je voulais savoir, comment peut-on savoir si on doit renvoyer une valeur par référence ou seulement la valeur leurs d'appel de méthode ?

    exmple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                    entier operator++();
                    entier& operator++();
    qu'elle sera la réel différence entre les deux ?

  2. #2
    Expert confirmé
    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 : 4 062
    Points
    4 062
    Par défaut
    Renvoyer une référence permet des opérations "à la chaîne":
    a=b=c=...
    a+b+c+...
    Pour l'opérateur ++ ce n'est pas necessaire car il est unaire.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 107
    Points : 48
    Points
    48
    Par défaut
    Le renvoi de valeur par référence ne sert donc que pour la surcharge d'opérateur quand on veut faire des opération a la chaine ?

    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    entier operator-(const entier &);
    il sera préférable de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    entier& operator-(const entier &);
    etc....

  4. #4
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Points : 283
    Points
    283
    Par défaut
    Renvoyer une référence permet aussi de ne pas faire une opération de copie. Chaque fois qu'on passe une valeur sans référence, il se produit une opération de copie.

    Donc si on veut transformer une chaine on peut utiliser aussi une référence :
    string & Transform (string & Str)
    {
    for (................... // transformation
    return Str;
    }
    Ici, il ne sert à rien de faire 2 copie !!! c'est inutile.

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    entier& operator-(const entier &)
    Ceci est un très bon exemple de ce qui NE FAUT PAS faire:
    -"entier" est probablement une variable peu volumineuse en mémoire, donc autant la passer en valeur plutôt que par référence
    -Mais surtout, on ne peut pas renvoyer par référence une variable crée dans la fonction (varaible locale ou temporaire), la variable doit rester en mémoire après le retour de la fonction.

    Ceci marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class A
    {
      A &operator-=(const A &a) { ... return *this; }
    };
    Quand il faut rendre le résultat d'un calcul, il faut absolument le retourner par valeur comme par ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template<class T>
    complex<T> operator+(const complex<T> &x, const complex<T> &y);
    Il ne faut généralement pas craindre pour la lenteur de la copie de retour (argument érroné généralement avancé), car le standard prévoit un cas particulier pour le retour de variable temporaire, et mon compilateur (Intel C++) le fait même pour les variables locales.
    Je peux écrire plus de précisions sur le retour des variables temporaires si vous me le demandez.

    On renvoit une référence par exemple dans les cas suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class A
    {
      private:
        int counter;
        float *p;
      public:
        int       &get_counter()       { return i; }
        const int &get_counter() const { return i; }
     
        float       &operator[](int i)       { return p[i]; }
        const float &operator[](int i) const { return p[i]; }
    };

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Citation Envoyé par Tipoun
    Chaque fois qu'on passe une valeur sans référence, il se produit une opération de copie.
    Pas toujours non, et heureusement.
    Boost ftw

Discussions similaires

  1. Retour d'une référence
    Par Isidore.76 dans le forum Langage
    Réponses: 10
    Dernier message: 21/10/2011, 10h17
  2. Réponses: 3
    Dernier message: 31/03/2008, 21h10
  3. Réponses: 2
    Dernier message: 24/08/2007, 01h54
  4. Réponses: 5
    Dernier message: 06/01/2006, 11h41
  5. Valeur de retour d'une procédure externe
    Par elekis dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 16/04/2004, 16h45

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