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

Langage C++ Discussion :

Retour de fonction par référence?


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut Retour de fonction par référence?
    Bonjour à tous.
    Je suis à la recherche d'un job, et donc, je me retrouve confronté aux tests techniques, dont certaines questions feraient hurler nos compilateurs adorés.

    L'une d'entre elles me tracasse particulièrement:

    supposant une classe Complexe représentant un nombre complexe.
    Choisissez la meilleur implémentation de l'addition:
    1. Complexe& operator+(Complexe const & a, Complexe const & b) {return Complexe(a.re+b.re, a.im+b.im);}
    2. Complexe& operator+(Complexe const * a, Complexe const * b) {return Complexe(a->re+b->re, a->im+b->im);}
    3. Complexe* operator+(Complexe const & a, Complexe const & b) {return new Complexe(a.re+b.re, a.im+b.im);}
    4. Complexe* operator+(Complexe const * a, Complexe const * b) {return new Complexe(a->re+b->re, a->im+b->im);}

    J'aurai personnellement définit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Complexe operator+(Complexe const & a, Complexe const & b) {Complexe c(a); return c+=b;}
    Complexe& Complexe::operator+=(Complexe const& other) {re+=other.re; im+=other.im;}
    ou encore, si on veut rester concis (mais il faut être friend...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Complexe operator+(Complexe const & a, Complexe const & b) {return Complexe(a.re+b.re, a.im+b.im);}
    Dans le même genre, une autre fois je trouve int& f(int a, int b) {return a+b;}Je croyais qu'on ne devait jamais retourner une référence sur une constante ou une temporaire…

    Qu'en pensez-vous? Suis-je dans l'erreur?

  2. #2
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Hello,
    Citation Envoyé par leternel Voir le message
    J'aurai personnellement définit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Complexe operator+(Complexe const & a, Complexe const & b) {Complexe c(a); return c+=b;}
    Complexe& Complexe::operator+=(Complexe const& other) {re+=other.re; im+=other.im;}
    Pareil.

    Parmis les 4 solutions proposées :
    • la première et la deuxième retournent une ref sur un temporaire et sont donc fausses.
    • La troisième et la quatrième génèrent des fuites mémoire si on fait pas attention et sont chiantes à utiliser.
    • De plus la quatrième redéfini l'opérateur+ sur des pointeurs : à éviter.

    S'il faut vraiment choisir dans cette liste, je prendrais la 3eme. Bien que ce soit un enfer à utiliser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Complexe a, b, c;
    Complexe *d = *(a+b) + c; // (a+b) est perdu, ne peut pas être libéré.
    delete d;
    Mais la seule solution valide est : std::complex.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    tu as quelques erreurs de recopie dans les codes que tu présentes trop de ; pas assez de , et ) par exemple^^

    Sinon : http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

    Les opérateur +-*/ ne peuvent pas retourner une référence ! (sauf cas super particulier/spécifique où l'opération modifierait un object déjà existant [pool, static ?] et le retournerait)
    Retourner la référence d'un temporaire est interdit.
    En sortie de fonction, la variable est détruite, et ta référence, fait référence à ... un joli paquet de bits qui vont joyeusement faire crasher ton application.
    Remplace la référence par un pointeur, rajoute un & devant le type de retour, tu as exactement le même résultat, mais ça semble bien plus flagrant que c'est pas à faire je trouve.

    Retourner un pointeur, "pourquoi pas", en tous cas rien ne l'interdit, sauf le bon sens à priori.
    Ca compilerait surement, tant que tu n'essaye pas de chaîner des opérations (sinon, tu vas aussi devoir définir les opérateurs utilisant un pointeur sur le type en question - rappel : il est impossible de définir une opération entre 2 pointeurs).

    M'est avis que si tu as trouvé ces 4 exemples sur des "tests" de boites, vaut mieux éviter la boite en question. En tous cas c'est ce que je ferais
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Bousk Voir le message
    M'est avis que si tu as trouvé ces 4 exemples sur des "tests" de boites, vaut mieux éviter la boite en question. En tous cas c'est ce que je ferais
    Peut-être que la boîte en question attendait comme réponse "aucune des 4", et attendait une proposition.
    Il faut voir sous quelle forme se présentait la question (et la zone de réponse).

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    La question était explicitement un QCM, et effectivement, ils sont disqualifiés à mes yeux.

    Vous me rassurez, j'avais fini par avoir un doute sur mes connaissances.
    Il n'y a pas de prolongation de durée de vie par les références, donc pas de temporaires possibles.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Ça me rappelle mon prof de C qui, dans son spécial "cours de C++", nous avait présenté un "operator+" qui était en fait un opérateur +=...
    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.

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par leternel Voir le message
    Qu'en pensez-vous?
    J'ai toujours pensé que les tests comme les entretiens servaient autant à un candidat pour tester la boîte qu'à la boîte pour tester le candidat...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Passage par référence et retour de fonction
    Par mister3957 dans le forum Langage
    Réponses: 2
    Dernier message: 16/05/2015, 13h12
  2. Reference et retour de fonction par valeur
    Par shadowsam dans le forum C++
    Réponses: 4
    Dernier message: 19/03/2011, 17h39
  3. Référence en retour de fonction, à transformer en hash
    Par raoulchatigre dans le forum Langage
    Réponses: 4
    Dernier message: 15/07/2005, 14h24
  4. retour d'objet par référence...
    Par sas dans le forum C++
    Réponses: 15
    Dernier message: 28/05/2005, 17h54
  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