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 :

références...


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    411
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 411
    Par défaut références...
    bonjour,
    j'aimerais savoir comment ca marche les références.
    pouvez-vous m'expliquer en détail svp
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    On n'est pas vraiment là pour ça ; les bouquins / cours par contre, oui. Par contre si tu as un problème plus précis avec l'utilisation des références, on se fera un plaisir de te l'expliquer.

  3. #3
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    411
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 411
    Par défaut références....
    bonjour,
    voici mon probleme :

    pourquoi lors d'un retour de référence on ceci : ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    const Date& getdate(int n)
    {
       return birthdays[n-1];
    }
    normalement on doit retourner qqch comme : &variable_de_ref puisque l'on retourne une référence et non un contenu

    merci d'avance.[/code]

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Salut

    J'ai fusionné les posts, merci de garder un seul sujet pour un même problème.

    En ce qui concerne ta question, &var renverrait l'adresse de var, chose qu'il faudrait faire si l'on retournait un pointeur. Or une référence se distingue justement des pointeurs par cet apsect : aucune syntaxe supplémentaire n'est nécessaire pour les utiliser.

    Relis bien la FAQ, tout ceci est expliqué en détail

  6. #6
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Parce que le C++ supporte le passage par référence. Il se charge de passer/renvoyer une référence au lieu d'une copie.
    Le C ne supporte que le passage par valeur, donc tu dois toi même renvoyer l'adresse de l'objet, qui est transmise par valeur...

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    411
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 411
    Par défaut
    ok et autre et derniere question sur ce sujet :

    une fois que l'on a mis donc la fonction qui retourne la référence,

    dans la fonction main, doit-on la stoquer comme ceci :

    int a=fct(); (ce que j'ai vu dans un code) ou alors comme ceci : int &a=fct(); (ce qui me semble plus logique)

    et pourquoi ?

  8. #8
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Les 2 vont fonctionner, mais le résultat ne sera pas pareil. fct() te renvoie un objet par référence. Maintenant, tu vas récupérer cet objet.
    si tu mets
    tu va en faire une copie, donc une copie de l'objet référencé (renvoyé parréférence). Si tu mets
    tu va conserver la référence renvoyée. La différence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    int & fct()
    {
        // attention à ne pas renvoyer un objet local (temporaire)
        // en référence, car tu renverrais une référence vers un objet
        // détruit dès qu'on sort de fct()
        static int n = 0;
        return n;
    }
     
    int i = fct();
    i = 10;
    cout << i << '\n'; // affiche 10
    cout << fct() << '\n'; // affiche 0 car on a modifié une copie
     
    int & r = fct();
    r = 10;
    cout << r << '\n'; // affiche 10
    cout << fct() << '\n'; // affiche 10 car on a modifié n via la référence...

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    411
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 411
    Par défaut
    je pense avoir saisie meme si quelque chose est encore un peu flou

    pourquoi peut on faire l'affectation suivante :

    alors que l'on retourne une référence !!!
    a n'est pas déclarée comme une référence a la difference de ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int &a=b; par exemple
    en effet, => int & fct();

  10. #10
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    parce que une référence reste une variable copiable, donc dans le cas de c'est une copie du retour de fct() qui est stockée dans a
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  11. #11
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Conceptuellement, il faut considérer que la fonction renvoie un objet.
    Lorsque tu écris c'est comme si tu écrivais et dans ce cas , UnObjet étant situé à droite du signe =, ceci s'interprète, comme d'habitude, comme la copie de la valeur de l'objet UnObjet dans a :
    il y a copie de l'objet retourné par la fonction dans l'objet a
    C'est pour cela, qu'on pourrait écrire : qui donnerait la valeur 10 à l'objet retourné par fct().
    Lorsque tu écris tu donne un nom (un alias) a à l'objet retourné par la fonction. Autrement dit, a est un nom pour l'objet retourné, il ne désigne pas un AUTRE objet comme dans le premier cas
    Relis attentivement les explications du post d' Aurelien.Regat-Barrel

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    411
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 411
    Par défaut
    oui mais dans ce cas derniere ambiguité :

    quelle différence y a til entre les deux choses suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int & fct()
    {
        return  a;
    }
     
    int main()
    {
    int a=fct();
    ...
    return 0;
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int fct()
    {
      return a;
    }
     
    int main()
    {
    int a=fct();
    ...
    return 0;
    }
    autrement dis => pourquoi déclarer une fonction qui renvoie une référence si on copie juste la variable qu'elle retourne et non la référence (voir main())

  13. #13
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    ça permet de modifier la valeur renvoyée par la fonction, ça peut être très utile dans certains cas (pour l'opérateur [] par exemple), ça permet aussi (quand c'est un objet qui est renvoyé) de faire des appels chainés, sans copie d'objets... par exemple : voir la FAQ, l'article sur l'idiome du paramètre nommé (si mes souvenirs sont bons)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  14. #14
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int & fct() 
    { 
        return  a; 
    }
    Comme l'a explicitement dit Aurélien, j'espère que ton a n'est pas une variable locale, sinon c'est foutu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int & fct() 
    { 
     int a ;
    ....    
     return  a;  BOOM
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int & fct(int a) 
    { 
    ....    
     return  a;  BOOM
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int & fct(int &a) 
    { 
    ....    
     return  a;  OK
    }
    Sinon, les explications fournies répondent à ta question , je crois.

  15. #15
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    La FAQ me parrait assez claire pourtant:
    Une référence est un alias, un nom alternatif pour un objet. Le principe à retenir est que tout se passe comme si c'était l'objet lui-même et non une référence sur lui.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int & fct() 
    { 
        return  a; 
    }
    c'est comme si tu renvoyais a. Sinon tu renvoies une copie. L'intérrêt peut donc aussi être au niveau des optimisations, pour économiser des recopies (bon sur un int c'est inutile), c'est le but des références constantes.

Discussions similaires

  1. [Livres/Références] Vos avis..
    Par Community Management dans le forum Livres
    Réponses: 6
    Dernier message: 25/07/2005, 19h31
  2. Références / tutoriels MFC COM
    Par DivisionParZéro dans le forum MFC
    Réponses: 3
    Dernier message: 03/02/2004, 17h49
  3. Passage d'un tableau par référence?
    Par sebduth dans le forum C
    Réponses: 9
    Dernier message: 16/07/2003, 18h32
  4. [Concept] Table de référence
    Par matlo dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 20/01/2003, 15h01

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