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 :

passage de paramètres : * et &


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Par défaut passage de paramètres : * et &
    Bonjour à tous !

    J'ai une petite question qui me trotte dans la tête depuis quelques temps, à savoir :

    En C, j'ai souvent vu (et fait) des appels de fonctions où l'on passe un pointeur sur un "objet" en paramètre, pour pouvoir le modifier et éviter une grosse recopie, du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void mafonction(mastructure1 *s)
    Après une rapide formation en C++, le prof écrivait systématiquement ce genre de chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void mafonction(mastructure1 &s)
    J'avais pendant le TP écris mes prototypes "à la C" avec * et il m'avait fait la remarque.

    D'où mon interrogation (son explication de l'époque est passé à la trappe ).

    En quoi est-ce différent ? Il y a une mécanique en jeu que je ne vois pas ? c'est une question de style ? de norme ?


    Merci !

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840

  3. #3
    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
    Pour moi qui viens du C, ce serait plutôt "utiliser les pointeurs quand on le peut et les références quand il le faut" pour la raison déjà citée sur le code appelant, surtout sur les types primitifs (pour les structures, ça se rejoint).

    En fait, il est extrêmement difficile de comprendre un code C++ utilisant du passage par référence sans que ces conditions soient toutes les deux réunies:
    • Utiliser un environnement de développement qui donne le prototype d'une fonction
    • Un strict respect de la const-correctness partout dans le code.

    Car sans cela, il est impossible de savoir si:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int a=42;
    UneFonction(a);
    Modifie a ou non. Et pour moi, le masquage d'informations est toujours un mal quand il s'agit d'informations sur quelque chose utilisé par le code appelant (ici, la variable a)
    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.

  4. #4
    Membre émérite Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Par défaut
    Citation Envoyé par gege2061

    Merci pour les liens, c'est vrai que j'aurais pu chercher un peu

    Je crois avoir bien compris

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Cela a été discuté quantité d'autres fois. Je crois que j'avais déjà pondu une tartine sur le sujet.
    Perso, les pointeurs bruts ne me plaisent pas car on ne sait jamais comment ils sont sensés être utilisés -> puit (sink) de donnée, donnée non effacable, donnée optionnelle, paramètre en sortie, ...

    Je tombe plus souvent sur des codes aux pointeurs portant peu d'informations, que sur des codes avec des références qui ne sont pas utilisées de façon const-correcte.
    Dans le premier cas, modifier le code pour rajouter plus d'infos est souvent complexe. Dans le second cas, c'est bête et méchant.

    Citation Envoyé par médinoc
    Car sans cela, il est impossible de savoir si:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int a=42;
    UneFonction(a);
    Mais si.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const int a=42;
    UneFonction(a);
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    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
    Je rejoins le point de vue de Médinoc même si il n'est pas orthodoxe.
    L'exemple cité par Luc n'est pas déterminant de mon point de vue puisqu'il empèche, non pas une modification par Une Fonction, mais par TOUTES les fonctions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const int a=42;
    UneFonction(a);
    D'autre part, il impose de retrouver et de revenir à la déclaration de l'argument pour comprendre la simple ligne Ce qui pour moi est un inconvénient majeur!

    A quoi servent les références à part être un sucre syntaxique (qui évite d'écrire des *) ?
    Conceptuellement, elles sont aussi complexes (sinon plus) à assimiler que les pointeurs. Elles en possèdent tous les inconvénients sans avoir leur seul (et pas négligeable) avantage (la possibilité de NULL). Leur définition classique (alias de ...) ne montre pas du tout le pourquoi de leur existence ni pourquoi on les utilise.
    Toutefois, elles permettent quelque chose que les pointeurs ne permettent absolument pas : une fonction peut maintenant renvoyer un objet. Ceci est impossible avec les pointeurs. Leur intérêt n'est pas dans le passage des arguments, il est dans les possibilités de retour des fonctions.
    Dans quel cas ceci est indispensable : pour la surcharge des opérateurs. Sans la surcharge des opérateurs, les références ne seraient qu'un gadget

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Citation Envoyé par diogene
    Elles en possèdent tous les inconvénients sans avoir leur seul (et pas négligeable) avantage (la possibilité de NULL).
    On peut facilement renverser cet argument : a moins de ne pas lire les avertissements du compilateur, il est assez difficile de se retrouver avec une reference sur rien. Qui n'a jamais eu de bug alors qu'un pointeur se retrouvait sur une zone de memoire invalide ?

    Citation Envoyé par diogene
    Leur définition classique (alias de ...) ne montre pas du tout le pourquoi de leur existence ni pourquoi on les utilise.
    Justement, si. On les utilise comme un moyen d'acceder a un objet deja existant.

    Citation Envoyé par diogene
    Toutefois, elles permettent quelque chose que les pointeurs ne permettent absolument pas : une fonction peut maintenant renvoyer un objet. Ceci est impossible avec les pointeurs.
    On peut renvoyer un pointeur sur un objet, comme un objet lui meme. Que veux-tu dire exactement ?

    Citation Envoyé par diogene
    Sans la surcharge des opérateurs, les références ne seraient qu'un gadget
    Dans la meme veine, la programmation en autre chose qu'en langage machine est un gadget : on ne gagne aucune fonctionnalite, juste une plus grande lisibilite. Et la lisibilite d'un code est a mon une des choses tres importante dans la mesure ou elle permet une maintenance plus facile. En reprenant un code ecrit par quelqu'un d'autre, je prefere largement lire des references que des pointeurs, ou l'on se demande a chaque fois qui a fait l'allocation et si la desallocation est faite correctement.

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

Discussions similaires

  1. [Forms]Passage de paramètre entre Forms et Reports
    Par jack554 dans le forum Reports
    Réponses: 4
    Dernier message: 30/03/2004, 13h58
  2. probleme lors du passage de paramètre
    Par maxmj dans le forum ASP
    Réponses: 4
    Dernier message: 18/11/2003, 00h15
  3. [XSL] Passage de paramètres à un template
    Par pantin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/06/2003, 13h28
  4. passage de paramètres
    Par pram dans le forum XMLRAD
    Réponses: 5
    Dernier message: 18/02/2003, 17h28
  5. passage en paramètre d'un array dynamique 2D
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2002, 19h47

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