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 :

Question sur le passage par référence


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 32
    Points : 30
    Points
    30
    Par défaut Question sur le passage par référence
    Bonjour,

    Je me pose encore des questions sur le passage par référence, notamment après avoir lu une explication donnée par Claude Delennoy dans l'un de ses livres d'exercices. Après avoir rappelé le rôle du passage par référence, il ajoute:
    "Toutefois, si l'argument muet est, de surcroît, déclaré avec l'attribut const, la fonction reçoit quand même une copie de l'argument effectif correspondant, lequel peut alors être une constante ou une expression d'un type susceptible d'être converti dans le type attendu."

    Ma question est la suivante: Y a t'-il toujours copie de l'argument effectif dans le cas où l'attribut const est ajouté ? Ou bien y a t'-il copie uniquement dans les deux cas cités ci-dessus (ce que je croyais avoir compris avant) ?

    Par ailleurs, dans tous les cas où il y a effectivement copie, le code ci-dessous correspondant à une fonction membre me pose un problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    String& String::operator=(const String & rhs)
    {
         if (this == &rhs)
              return *this;
         .
         .
         .
    }
    En effet, s'il y a copie, l'objet créé aura toujours une adresse différente du pointeur this. Donc, même si l'argument rhs fait référence au même objet que celui pointé par this, le test ne peut pas fonctionner !

    Si vous pouviez m'indiquer mon erreur, je vous en serait fort reconnaissant.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Il l'exprime assez mal, mais ce qu'il tente d'exprimer c'est que, si tu déclare un argument de fonction sous la forme d'une référence constante, il est possible de passer une variable temporaire anonyme, s'il existe un constructeur pour le type attendu capable de servir d'opérateur de conversion.

    Par exemple, il existe un constructeur pour la classe std::string qui prend comme argument un char const * (une chaine "C style en fait )

    Tu peux donc déclarer une chaine str sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string str("Salut Koala");
    mais ce constructeur agit comme opérateur de conversion d'un char const * en std::string, comme on peut le remarquer avec le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string str;
    str="Salut toi";
    car dans ce deuxième exemple "Salut toi" n'est en réalité... pas un std::string mais... un char const *.

    Si tu as une fonction prenant comme argument une référence constante sur une std::string proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void foo(std::string const & truc);
    tu peux, fatalement, envisager de l'invoquer sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string str("Salut Koala");
    foo(str);
    et, comme il s'agit d'une référence, il n'y aura pas de copie de l'objet nommé str.

    Mais tu peux aussi invoquer cette fonction sous la forme de
    Et, dans ce cas, le constructeur de std::string prenant un char const * comme paramètre agira encore une fois comme un opérateur de conversion de char const * en std::string, mais, comme "Salut toi" n'est pas une std::string et que... c'est ce qu'attend la fonction foo, il y a création de ce que l'on appelle une "variable temporaire anonyme" de type... std::string.

    En effet, cette variable n'existera que... durant l'exécution de foo, ce qui la rend... temporaire et, comme il n'y a aucun identifiant qui permette d'utiliser cette variable en dehors de foo, il s'agit bel et bien d'une fonction anonyme

    Tout cela pour dire que, normalement, s'il existe effectivement un objet du type attendu, il n'y aura ni copie ni création d'objet, mais que, dans certaines circonstances (lorsque ce qui est passé en argument à la fonction n'est pas du type attendu mais qu'il existe effectivement un constructeur pouvant faire office d'opérateur de conversion), il peut y avoir création d'un objet.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 32
    Points : 30
    Points
    30
    Par défaut
    Merci d'avoir pris le temps de m'expliquer en détail ce problème. Ton explication est très claire.

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

Discussions similaires

  1. POO: Passage par référence, question technique.
    Par FMaz dans le forum Langage
    Réponses: 7
    Dernier message: 07/05/2009, 20h04
  2. [PEAR] Objet : Question sur le passage de variable
    Par Norabfr dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 07/01/2006, 01h07
  3. Réponses: 4
    Dernier message: 26/12/2005, 17h01
  4. Passage par référence
    Par difficiledetrouver1pseudo dans le forum Langage
    Réponses: 9
    Dernier message: 28/09/2005, 11h17
  5. Problème très rapide de passage par référence
    Par Noxexplorer dans le forum ASP
    Réponses: 2
    Dernier message: 23/06/2005, 10h02

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