c ++ * vs & dans la déclaration de fonction [double]
-
22-08-2019 - |
Question
Possible en double: différence entre la variable de pointeur et variable de référence en C ++
Quand dois-je déclarer mes variables comme pointeurs vs objets transmis par référence? Ils compilent la même chose dans l'assemblage (au moins de temps d'exécution asymptotiquement) alors quand dois-je utiliser qui?
void foo(obj* param)
void foo(obj& param)
La solution
Ma règle est simple: utilisez * lorsque vous voulez montrer que la valeur est facultative et peut donc être 0
. Hors de la règle: tous les _obj_s autour sont stockés dans des conteneurs et que vous ne voulez pas faire votre code laides en utilisant partout foo(*value);
au lieu de foo(value);
Alors pour montrer que la valeur ne peut pas être 0 mis assert(value);
à la fonction commence.
Autres conseils
Je suis guide de style Google norme comme il fait le plus de sens pour moi. Il déclare:
Dans le paramètre de fonction affiche tous les références doivent être const:
void Foo(const string &in, string *out);
En fait, il est une convention très forte dans le code Google que les arguments d'entrée sont des valeurs ou des références const tandis que arguments de sortie sont des pointeurs. Contribution Les paramètres peuvent être des pointeurs const, mais nous permettons jamais référence non const paramètres.
Un cas quand vous voudrez peut-être une entrée paramètre soit un pointeur const est si vous voulez souligner que la argument n'est pas copié, il doit existent pour la durée de vie de l'objet; il est généralement préférable de documenter ce dans Tout commentaire. adaptateurs STL tels que bind2nd et mem_fun ne permettent pas paramètres de référence, vous devez donc déclarer les fonctions avec pointeur paramètres dans ces cas aussi.
L'une des raisons d'utiliser des pointeurs est s'il est logique de transmettre une valeur NULL
dans la fonction. Avec un pointeur, il est prévu de pouvoir le faire. Avec une référence, il ne devrait pas être en mesure de le faire.
(Cependant, en faisant des choses difficiles, il est toujours possible de passer un NULL dans un paramètre de référence. Vous pouvez vous attendre que la fonction appelée peut se bloquer dans ce cas.)
Une autre convention est que si vous passez un pointeur dans une fonction, la fonction peut utiliser le pointeur pour prendre possession de l'objet (en particulier dans un environnement compté référence COM-like). Si vous passez une référence, puis la fonction appelée peut attendre d'utiliser l'objet pendant toute la durée de l'appel de fonction mais pas de garder un pointeur vers l'objet pour une utilisation ultérieure.
L'autre différence entre les pointeurs et les références est qu'il est sous-entendu que vous ne tiendrez pas une référence, à moins que vous passez un à un constructeur. pointeurs de passage peut signifier qu'un objet peut conserver pendant un certain temps, comme un objet motif composite.
Une bonne raison pour laquelle j'utiliser des pointeurs et pas des références dans mes applications C ++, est la lisibilité. Lorsque vous utilisez un pointeur que vous voyez ce qui se passe réellement, et lors de l'utilisation des pointeurs de la syntaxe vous indique ce qui se passe réellement.
Idem pour "0" ou "NULL". Je préfère utiliser « NULL », ainsi 3 mois plus tard, quand je vois un code qui ressemble à:
somevar_1 = 0;
somevar_2 = NULL;
Je sais que somevar_1
est un int
(ou float
) et somevar_2
est une sorte de pointeur.