Entendo a sintaxe e a semântica geral de ponteiros versus referências, mas como devo decidir quando é mais ou menos apropriado usar referências ou ponteiros em uma API?
Naturalmente, algumas situações precisam de uma ou de outra ( operator++
precisa de um argumento de referência), mas, em geral, estou descobrindo que prefiro usar ponteiros (e const), pois a sintaxe é clara: as variáveis estão sendo passadas destrutivamente.
Por exemplo, no seguinte código:
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
}
Com o ponteiro, é sempre (mais) óbvio o que está acontecendo; portanto, para APIs e afins, onde a clareza é uma grande preocupação, os ponteiros não são mais apropriados que as referências? Isso significa que as referências devem ser usadas apenas quando necessário (por exemplo operator++
)? Há alguma preocupação de desempenho com um ou outro?
EDITAR (ATUALIZADO):
Além de permitir valores NULL e lidar com matrizes brutas, parece que a escolha se resume à preferência pessoal. Aceitei a resposta abaixo que faz referência ao Guia de estilo C ++ do Google , pois apresenta a visão de que "As referências podem ser confusas, pois possuem sintaxe de valor, mas semântica de ponteiro".
Devido ao trabalho adicional necessário para limpar argumentos de ponteiro que não devem ser NULL (por exemplo add_one(0)
, chamará a versão do ponteiro e interromperá durante o tempo de execução), faz sentido do ponto de vista da manutenção usar referências onde um objeto DEVE estar presente, embora seja uma vergonha perder a clareza sintática.
add_one(a);
que não está claro que a
será modificado? Diz exatamente o código: adicione um .
addOneTo(...)
. Se não é isso que você quer fazer, basta olhar para a declaração.