Je comprends la syntaxe et la sémantique générale des pointeurs par rapport aux références, mais comment 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++
a besoin d'un argument de référence), mais en général, je trouve que je préfère utiliser les pointeurs (et les pointeurs constants) car la syntaxe indique clairement 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 APIs 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 devraient être utilisées que lorsque cela est nécessaire (par ex. operator++
) ? L'un ou l'autre pose-t-il des problèmes de performance ?
ÉDITER (PÉRIMÉ) :
Outre l'autorisation des valeurs NULL et le traitement des tableaux bruts, il semble que le choix se résume à une préférence personnelle. J'ai accepté la réponse ci-dessous qui fait référence Guide de style C++ de Google Les références peuvent prêter à confusion, car elles ont une syntaxe de valeur mais une sémantique de pointeur.
En raison du travail supplémentaire nécessaire pour assainir les arguments de pointeurs qui ne devraient pas être NULL (par ex. add_one(0)
appellera la version pointeur et se brisera pendant l'exécution), il est logique, du point de vue de la maintenabilité, d'utiliser des références là où un objet DOIT être présent, bien qu'il soit dommage de perdre la clarté syntaxique.