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)
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top