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 :

Différence entre Pointeurs et References


Sujet :

C++

  1. #41
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Pour commencer, je voudrais revenir sur ce qui a été dit :

    Je suis tout à fait d'accord qu'au niveau du code binaire généré, pointeurs et référence sont du pareil au même, mais, au niveau du code C++ (et c'est ce qui nous intéresse ici ), ce sont deux choses radicalement différentes! :

    D'abord parce que les pointeurs et les références présentent des possibilités différentes (le fait qu'un pointeur puisse etre nul et qu'une référence apporte une garantie de non nullité étant l'une des différences principales)

    Ensuite, parce qu'un pointeur est une variable de type numérique qui représtente l'adresse à laquelle on va trouver une variable d'un type donné, alors qu'une référence est un alias de la variable.

    Rajoutez à cela la capacité des références à suivre et à respecter la constance : une référence constante certifie que l'objet passé en référence ne sera pas modifié, alors qu'un pointeur constant ne garanti que le fait que l'on n'essayera pas de modifier l'adresse pointée (il faut passer un pointeur sur un objet constant ou un pointeur constant sur un objet constant pour garantir que l'ojbet ne sera pas modifié )

    Il faut aussi compter sur le fait que les références permettent de créer des variables temporaires non nommées, et c'est la raison pour laquelle on ne peut fournir une valeur par défaut que dans le cas de référence constante (on créera une variable qui n'existera que pour la durée de l'exécution de la fonction appelée, il n'y a donc absolument pas lieu d'en permettre la modification )

    Enfin, parce qu'Ils s'utilisent de manière radicalement différente, et pas seulement du point de vue de la syntaxe :

    Imaginez une chaine C style comme exemple d'utilisation d'un pointeur. Si vous voulez réallouer un espace mémoire supplémentaire, vous devrez passer par ... un pointeur de pointeur, et vous devrez donc penser à accéder à ce qui est pointé par ce pointeur de pointeur.

    De là à se retrouver à travailler avec des pointeurs de pointeurs de pointeurs (de pointeurs, de... ), il n'y a qu'un pas, et la complexité de travail suivra la même évolution

    Citation Envoyé par Emmanuel Deloget Voir le message
    Personnellement, j'aurais fait deux fonctions : une fonction à un argument, une autre à deux arguments. Comme ça, élimination des tests et je n'ai pas besoin de passer un pointeur.
    Citation Envoyé par oodini Voir le message
    Dans ce cas là, je n'avais plus besoin de passer par des fonctions.
    L'intérêt était de factoriser les deux traitements.
    Tu aurais très bien pu faire quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void foo(std::vector<type> & tab)
    {
        /* remplissage du tableau */
    }
    void foo(std::vector<type> & first, std::vector<type>& second)
    {
        foo(first);
        foo(second);
    }
    et
    1. tu te serais évité l'utilisation d'un pointeur
    2. tu te serais évité des tests de non nullité sur le second argument
    3. ton code aurait été parfaitement factorisé
    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

  2. #42
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    En règle générale, effectivement.

    Mais le code concerné est si menu que ça ne valait franchement pas le coup de faire deux fonctions (déjà, en faire une...).

  3. #43
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par oodini Voir le message
    En règle générale, effectivement.

    Mais le code concerné est si menu que ça ne valait franchement pas le coup de faire deux fonctions (déjà, en faire une...).
    Dans ce cas précis, la factorisation t'empêche d'avoir un chemin optimal. Tu as certainement besoin de tests dans ta fonction unique, tests que tu pourrais éviter en écrivant deux fonctions. Puisque le but est d'initialiser les deux vecteurs dans la même boucle, on peut légitimement penser que les performances sont un facteur important du design.

    Le changement n'est pas anodin, c'est sûr. Deux fonctions qui font un traitement similaire vont à l'encontre de la notion de non duplication du code (ça fait deux endroits à maintenir). Comme le dirait personne en particulier, "it's your call".
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  4. #44
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Si ça n'avait tenu qu'à moi, il n'y aurait pas eu de fonction, car il n'y a quasiment pas de redondance de code. C'est un gros algorithme. Idéalement, il eût fallu faire des blocs de code rétractables via des #pragma region.

    Mais je suis dans un projet où la modularisation en fonctions est un dogme.

Discussions similaires

  1. Différence entre Service References & Web References ?
    Par xpander dans le forum Services Web
    Réponses: 2
    Dernier message: 19/10/2011, 14h39
  2. différence entre pointeur et valeur ?
    Par cmoibal dans le forum Débuter
    Réponses: 12
    Dernier message: 24/01/2008, 13h25
  3. Différence entre référence et pointeur ?
    Par Vivian Pennel dans le forum Langage
    Réponses: 3
    Dernier message: 03/08/2007, 17h19
  4. Réponses: 3
    Dernier message: 07/05/2002, 16h06

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