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 :

[Langage] passage par référence /adresse


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut [Langage] passage par référence /adresse
    les cas suivants font exacetement la même chose:

    ---Passage par référence-----------

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int f(int& x){
    x=3;
    return 0;
    }
     
    int main()
    {
    int a=4;
     
    f(a);
    std::cout<<a;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int f(int& x){
    x=3;
    return 0;
    }
     
    int main()
    {
    int a=4;
    int *b=&a;
    f(*b);
    std::cout<<a;
    }
    ---Passage par adresse-------------:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int f(int* x){
    x=3;
    return 0;
    }
     
    int main()
    {
    int a=4;
    int *b=&a;
    f(&a);
    std::cout<<a;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int f(int* x){
    x=3;
    return 0;
    }
     
    int main()
    {
    int a=4;
    int *b=&a;
    f(b);
    std::cout<<a;
    }
    quel est celui qui est à privilégier, et dans quel cas?
    perso, je préfère le passagepar référence, je trouve ca plus naturel que de passer par un pointeur, alors qu'on peut le faire avec la variable elle meme
    deplus, ca ne crée pas de variable supplémentaires
    et dans le passage par adresse, je préfere le premier cas.
    enfin c mon avis de débutant
    et vous?

  2. #2
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    Salut.
    Je prefere le passage d'argument par adresse, c'est plus commun et plus habituel

  3. #3
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Pour la version par adresse, on affecte la valeur en déférençant le pointeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int f(int* x){
    *x=3;
    return 0;
    }
    L'avantage du paramètre par référence est que la fonction s'écrit de manière naturelle (pas besoin de déférencer).

    L'avantage du paramètre par pointeur est que lorsqu'on appelle la fonction, on sait qu'on veut modifier le paramètre par on passe l'adresse de la variable.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Par défaut
    Citation Envoyé par Trunks Voir le message
    L'avantage du paramètre par pointeur est que lorsqu'on appelle la fonction, on sait qu'on veut modifier le paramètre par on passe l'adresse de la variable.
    ??
    C'est la présence ou non du qualifieur const qui permet de savoir si une fonction/méthode modifie le paramètre qu'on lui passe.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    En général on utilise que des références sauf dans le cas où le paramètre peut être nul.

  6. #6
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Pareil qu'au dessus, ici il n'y a absolument aucune bonne raison d'utiliser un pointeur, il y a juste a mettre une reference const ou pas selon si la fonction a besoin ou pas de modifier le paramettre.

    Utiliser un pointeur veut souvent dire soit que le pointeur peut être null (dans le cas ou il y a un test à l'execution qui prendrait en compte ce cas), ou qu'on va manipuler directement la mémoire liée. Dans les autres cas, il n'y a pas de raison d'utiliser un pointeur.

    En fait, par défaut, n'utilisez pas de pointeur. Ne le faites seulement si vous y êtes forcé, ça vous épargnera beaucoup de potentiel bugs.

  7. #7
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Citation Envoyé par Montag Voir le message
    ??
    C'est la présence ou non du qualifieur const qui permet de savoir si une fonction/méthode modifie le paramètre qu'on lui passe.
    Le const est utile lorsqu'on passe une structure ou classe en paramètre. Vu que ce paramètre est lourd, on va éviter une copie de ce dernier, c'est pour celà qu'on le passe par référence ou via un pointeur. Cependant, comme il n'est pas amené à être modifié, on le déclare en const pour le signaler et ainsi éviter un éventuel accident.

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Par défaut
    Citation Envoyé par Trunks Voir le message
    Le const est utile lorsqu'on passe une structure ou classe en paramètre. Vu que ce paramètre est lourd, on va éviter une copie de ce dernier, c'est pour celà qu'on le passe par référence ou via un pointeur. Cependant, comme il n'est pas amené à être modifié, on le déclare en const pour le signaler et ainsi éviter un éventuel accident.
    Oui et donc ?
    Mon intervention avait pour but de faire remarquer que ton argument en faveur des pointeurs :
    L'avantage du paramètre par pointeur est que lorsqu'on appelle la fonction, on sait qu'on veut modifier le paramètre par on passe l'adresse de la variable.
    était douteux pour ne pas dire faux.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Bref, utilise des références, sauf quand tu veux accorder à l'utilisateur de ta fonction (toi peut-être?) un paramètre nulle, que ta fonction prendra la responsabilité de tester (tout n'est qu'une question de responsabilité, utilisateur ou exécutant ?).

  10. #10
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Citation Envoyé par Montag Voir le message
    Oui et donc ?
    Mon intervention avait pour but de faire remarquer que ton argument en faveur des pointeurs :

    était douteux pour ne pas dire faux.
    Ok, je te l'accorde. Je disais ça en pensant aux types prédéfinis. Si on fait f(&val), on se doute qu'on veuille modifier val alors que si on fait f(val), c'est plus invisible.

    Mais comme ont dit 2 autres personnes, si une valeur ne peux pas être nulle, alors autant utiliser les références.

Discussions similaires

  1. Passage par référence
    Par e1lauren dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 01/09/2006, 13h59
  2. Passage par copie vs passage par référence
    Par bolhrak dans le forum C++
    Réponses: 11
    Dernier message: 21/08/2006, 00h37
  3. Réponses: 4
    Dernier message: 26/12/2005, 18h01
  4. Passage par référence
    Par difficiledetrouver1pseudo dans le forum Langage
    Réponses: 9
    Dernier message: 28/09/2005, 12h17
  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, 11h02

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