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 :

Arguments *, &, const ?


Sujet :

C++

  1. #1
    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 Arguments *, &, const ?
    Bonjour à tous,

    Je me remet un peu à jour en terme de connaissances basiques sur le C++.

    Je voudrais savoir la différence entre un passage par référence et un par pointeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MaFonction1(int &x); // Par référence
    MaFonction2(int *x); // Par pointeur
    MaFonction2(int x); // Par valeur
    Je vois bien la différence entre par valeur et par référence/pointeur.

    Par contre, c'est la différence entre par pointeur et par référence qui me dérange.
    Dans le cas d'un pointeur, on économise la copie de l'argument au profit d'une simple copie d'adresse mémoire (donc en général 4 octets).
    Concernant les droits de la fonction, on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MaFonction2(int *x);
    MaFonction2(const int *x);
    MaFonction2(int * const x);
    MaFonction2(const int * const x);
    Quelques question:
    est-ce que on peut faire également
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MaFonction2(int &x);
    MaFonction2(const int &x);
    MaFonction2(int & const x);
    MaFonction2(const int & const x);
    ?

    Le passage par pointeur ne nécessite qu'une copie du pointeur passé, le passage par référence, comment se débrouille le compilateur?


    Merci beaucoup de m'éclairer là dessus

    A bientôt

    Aurélien

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Différence pointeur/reference

    Lorsque l'on m'a apris cette notion, le collègue qui m'a enseigné m'a dit:
    1/ Une référence, c'est comme un pointeur (juste la syntaxe est différente)
    2/ Un pointeur peut être NULL,
    3/ Une référence ne peut pas être NULL.

    Donc on utilise un pointeur quand cela à un sens qu'il soit NULL, sinon on utilise une référence.

    En interne, une référence est gérée comme un pointeur donc c'est les mêmes performances lors du passage de paramètres
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    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
    Ok, merci beaucoup

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    Différence pointeur/reference

    Lorsque l'on m'a apris cette notion, le collègue qui m'a enseigné m'a dit:
    1/ Une référence, c'est comme un pointeur (juste la syntaxe est différente)
    2/ Un pointeur peut être NULL,
    3/ Une référence ne peut pas être NULL.
    C'est une première approximation (du moins si on ajoute qu'une référence est automatiquement référencée et ne peut pas être rebindée). Il y a un certains nombres de détails qui font que s'attacher trop fort à cette première approximation pose des problèmes.

    Une référence introduit un nom supplémentaire pour un objet. Et si cet objet est temporaire, sa durée de vie va être prolongée pour correspondre à celle de la référence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string const& foo = std::string("bar") + std::string("quux");
    par exemple a des effets sur la durée de vie du temporaire qu'il n'est pas possible d'avoir avec des pointeurs.

    En interne, une référence est gérée comme un pointeur donc c'est les mêmes performances lors du passage de paramètres
    Pour le passage de paramètre, il y a de grandes chances que ce soit le cas. D'autres utilisations de références peuvent être plus transparentes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct s { int a, b } x; int & b = x.b;
    le compilateur peut très bien ne jamais utiliser de la mémoire pour b.

    Donc on utilise un pointeur quand cela à un sens qu'il soit NULL, sinon on utilise une référence.
    C'est un critère permettant de choisir. Pas le plus pertinent à mon avis. J'ai beaucoup de mal à préférer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void f(Type& x) {
       delete &x;
    }
    à l'alternative avec des pointeurs. Même si on ne passe jamais un pointeur nul. Je crois avoir expliqué dans le passé mon point de vue en détail.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    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 394
    Par défaut
    Bonjour,
    Alors, déjà, les réponses "académiques" :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int MaFonction2(int &x);              // Oui
    int MaFonction2(const int &x);        // Oui
    int MaFonction2(int & const x);       // Non: La référence est déjà non-modifiable
    int MaFonction2(const int & const x); // Non, pour la même raison.

    Puis les réponses "personnelles": Au début, venant du C, j'étais partisans de "Références seulement là où les pointeurs ne marchent pas".
    ..Mais j'ai, lentement mais sûrement, changé d'avis.

    À présent, je conseille d'utiliser les références partout où c'est possible, SAUF s'il est question d'allocation dynamique ou de tableau C-style : Pour moi, une référence désigne un élément et un seul.
    Et encore, j'ai aussi tendance à utiliser les pointeurs plutôt que les références dès que je joues avec les fonctions virtuelles.
    Ce qui donne:
    • Paramètre optionnel : forcément pointeur (pour pouvoir être NULL)
    • Paramètre vector : référence
    • Paramètre tableau : pointeur
    • Paramètre élément particulier d'un tableau ou d'un vector : référence
    • Valeur de retour née d'un new : pointeur
    • Paramètre sur lequel on fera un delete : pointeur
    • Paramètre sur lequel on appelle une méthode virtuelle : Pour moi, généralement pointeur.
    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.

  6. #6
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Paramètre optionnel : forcément pointeur (pour pouvoir être NULL)
    Il m'est arrivé d'avoir à écrire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Truc( const Objet & = Objet() );

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    La surchage permet déjà de définir des paramètres optionnels.
    Sinon, il y aussi boost.optional.

Discussions similaires

  1. Réponses: 9
    Dernier message: 18/10/2013, 13h05
  2. [template] passer un argument par valeur ou en const &
    Par méphistopheles dans le forum C++
    Réponses: 33
    Dernier message: 04/07/2010, 19h46
  3. Réponses: 3
    Dernier message: 02/01/2009, 12h25
  4. Réponses: 4
    Dernier message: 10/04/2006, 22h30
  5. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08

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