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 :

renvois de référence constantes.


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 3
    Par défaut renvois de référence constantes.
    Tout d'abord, bonjour à tous, je suis un nouveau venu sur le forum :p, je suis encore un noob, donc préparez-vous à voir souvent mes topics, car j'ai plein de questions !
    Ma question est vraiment simpliste pour les personnes ayant déjà coder en C++ à mon avis, en fait, je ne comprend pas pourquoi parfois il faut qu'un renvoie de référence dans une fonction ou une méthode soit constante, si cette dernière fait justement réference sur une variable ou un objet local, voici un bout de code qui parlera bien mieux à ma place :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     A& fct()
    {
    A objet_A;
    A& ref = objet_A;
    return ref;
    }
     
    int main()
    {
    A& reference_A = fct();
    return 0;
    }
    En ce cas la, on m'a dit que ce code est considéré comme faux, car il faut que fct renvoie une référence constante, pourriez-vous m'expliquer pourquoi s'il vous plait?

  2. #2
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    moi je dirais que ton code est faux car tu renvois une variable locale qui est mise en place sur la pile de la méthode mais des la finde cette derniere bah ya plus rien sur la pile

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 3
    Par défaut
    ah vi je sais mais, en fait si tu veux j'essai de créer une classe de perso de string, bon bien sur, rien a voir avec la vraie hein, c'est juste pour m'experimenter avec les classes hein, mais en fait dans la surcharge d'operateur, notament l'operateur +
    Je créer un objet string sur la pile et je le compose de la concaténation des deux string précédents, puis je renvoi la référence de ce string locale, c'est faisable ou c'est faux?

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je créer un objet string sur la pile et je le compose de la concaténation des deux string précédents, puis je renvoi la référence de ce string locale, c'est faisable ou c'est faux?
    L'objet est détruit dès la fin de la fonction, impossible d'en renvoyer une référence. Pour que ce soit possible il faut que l'objet ait une durée de vie supérieure à la fonction.
    C'est pour cela que l'opérateur + renvoie toujours par valeur et non par référence.

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 3
    Par défaut
    Ah d'accord, merci beaucoup Laurent Gomila, je comprends.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    Citation Envoyé par castorus

    En ce cas la, on m'a dit que ce code est considéré comme faux, car il faut que fct renvoie une référence constante, pourriez-vous m'expliquer pourquoi s'il vous plait?

    on t a peut etre plutot dit qu il faut une reference statique :
    A & mafonction(){

    static A a;

    return a;
    }
    Dans ce cas, ton objet est dans le tas et non plus dans la pile . Il survit a la sortie de la fonction . C est donc l equivalent d une variable globale (avec tous les dangers que cela implique)

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    En effet il n'est pas dans la pile, mais il n'est pas dans le tas non plus : Il est dans les données statiques, comme toutes les variables globales.

    En fait, c'est juste une variable globale à accès restreint.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Ecriture étrange d'une référence constante
    Par ram-0000 dans le forum Débuter
    Réponses: 5
    Dernier message: 12/03/2009, 13h19
  2. Réponses: 2
    Dernier message: 07/11/2008, 16h48
  3. itérer sur une référence constante de vector
    Par manonoc dans le forum SL & STL
    Réponses: 1
    Dernier message: 17/08/2008, 12h50
  4. Réponses: 6
    Dernier message: 12/07/2006, 15h34
  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