Je comprends la syntaxe et la sémantique générale des pointeurs par rapport aux références, mais comment dois-je décider quand il est plus ou moins approprié d'utiliser des références ou des pointeurs dans une API?
Naturellement, certaines situations nécessitent l'un ou l'autre ( operator++
nécessite un argument de référence), mais en général, je trouve que je préfère utiliser des pointeurs (et des pointeurs const) car la syntaxe est claire que les variables sont passées de manière destructive.
Par exemple dans le code suivant:
void add_one(int& n) { n += 1; }
void add_one(int* const n) { *n += 1; }
int main() {
int a = 0;
add_one(a); // Not clear that a may be modified
add_one(&a); // 'a' is clearly being passed destructively
}
Avec le pointeur, il est toujours (plus) évident de savoir ce qui se passe, donc pour les API et autres où la clarté est une grande préoccupation, les pointeurs ne sont-ils pas plus appropriés que les références? Cela signifie-t-il que les références ne doivent être utilisées qu'en cas de besoin (par exemple operator++
)? Y a-t-il des problèmes de performance avec l'un ou l'autre?
MODIFIER (MIS À JOUR):
En plus d'autoriser les valeurs NULL et de traiter les tableaux bruts, il semble que le choix se résume à des préférences personnelles. J'ai accepté la réponse ci-dessous qui fait référence au guide de style C ++ de Google , car ils présentent l'avis que "les références peuvent être déroutantes, car elles ont une syntaxe de valeur mais une sémantique de pointeur".
En raison du travail supplémentaire requis pour désinfecter les arguments de pointeur qui ne devraient pas être NULL (par exemple add_one(0)
, appellera la version du pointeur et s'arrêtera pendant l'exécution), il est logique, dans une perspective de maintenabilité, d'utiliser des références où un objet DOIT être présent, bien que ce soit une honte pour perdre la clarté syntaxique.
add_one(a);
n'est pas clair qui a
va être modifié? Il dit juste dans le code: ajoutez-en un .
addOneTo(...)
. Si ce n'est pas ce que vous voulez faire, regardez simplement la déclaration.