270 votes

Pointeur vs Référence

Ce serait mieux de la pratique au moment de donner une fonction de la variable d'origine pour travailler avec:

unsigned long x = 4;

void func1(unsigned long& val) {
     val = 5;            
}
func1(x);

ou:

void func2(unsigned long* val) {
     *val = 5;
}
func2(&x);

OIE: Est-il une raison d'en choisir un plutôt qu'un autre?

----edit---- fixe premier exemple afin qu'il appelle func1 plutôt que inexistants func

296voto

Nils Pipenbrinck Points 41006

Ma règle d'or est:

Utiliser des pointeurs si vous voulez faire de l'arithmétique des pointeurs avec eux (par exemple, l'incrémentation de l'adresse de pointeur pour parcourir un tableau) ou si vous devez passer un pointeur NULL.

Utiliser des références autrement.

74voto

Johann Gerell Points 10649

Je pense vraiment que vous bénéficierez de l'établissement à la suite d'appel de fonction des directives de codage:

  1. Comme dans tous les autres endroits, toujours const-corriger.

    • Remarque: Cela signifie, entre autres choses, que seulement les valeurs (voir point 3) et les valeurs transmises par la valeur (voir le point 4) de l'absence de l' const spécificateur.
  2. Seulement de transmettre une valeur par pointeur si la valeur 0/NULL est une entrée valide dans le contexte actuel.

    • Justification 1: Comme un appelant, vous voyez que ce que vous passer doit être dans un état utilisable.

    • Justification 2: Comme il est appelé, vous savez que tout ce qui vient dans est dans un état utilisable. Donc, pas de NULL-vérifier ou d'erreur de manipulation qui doit être fait pour que la valeur.

    • Justification 3: les Justifications 1 et 2 seront compilateur forcée. Toujours attraper les erreurs au moment de la compilation, si vous le pouvez.

  3. Si un argument de fonction est une valeur, puis le passer par référence.

    • Justification: Nous ne voulons pas casser le point 2...
  4. Choisissez "passage par valeur" de plus de "passer par référence const" si et seulement si la valeur est un POD (Plain old Discbased) ou assez petits (ram) ou d'une autre manière assez bon marché (time-wise) à copier.

    • Justification: Éviter les copies.
    • Remarque: assez petit et assez bon marché ne sont pas absolus paramètres mesurables.

24voto

Aaron N. Tubbs Points 1019

Finalement, cela finit par être subjectif. La discussion jusqu'à présent est utile, mais je ne pense pas qu'il y a une bonne ou une réponse décisive à cette question. Beaucoup dépendra des lignes directrices de style et à vos besoins du moment.

Bien qu'il existe des capacités différentes (si oui ou non quelque chose peut être NULL) avec un pointeur, la plus grande différence pratique pour un paramètre de sortie est purement syntaxique. Google C++ Style Guide (http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml), par exemple, les mandats, les pointeurs uniquement pour les paramètres de sortie, et ne permet que des références qui sont const. Le raisonnement est l'une des raisons de lisibilité: quelque chose avec la valeur de la syntaxe ne doit pas avoir pointeur de sens sémantique. Je ne dis pas que c'est nécessairement bon ou mauvais, mais je pense que le point ici est que c'est une question de style, pas de justesse.

11voto

xtofl Points 22333

Vous ne pouvez pas stocker des références, mais vous pouvez stocker des pointeurs. Dans le code qui aurait besoin de stocker un pointeur vers un objet afin de l'utiliser plus tard, je préfère en passant un pointeur.

Si l'objet passé est uniquement destiné à être utilisé pour la durée de l'appel, j'opterais pour la référence.

7voto

Max Caceres Points 1197

Vous devriez passer un pointeur si vous allez modifier la valeur de la variable. Même si, techniquement, de passer une référence ou un pointeur sont les mêmes, en passant un pointeur dans votre cas d'utilisation est plus lisible comme ça "publie" le fait que la valeur va être modifié par la fonction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X