Entiendo la sintaxis y la semántica general de los punteros versus las referencias, pero ¿cómo debo decidir cuándo es más o menos apropiado usar referencias o punteros en una API?
Naturalmente, algunas situaciones necesitan una u otra ( operator++
necesita un argumento de referencia), pero en general estoy descubriendo que prefiero usar punteros (y punteros constantes) ya que la sintaxis es clara de que las variables se pasan de manera destructiva.
Por ejemplo, en el siguiente 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
}
Con el puntero, siempre es (más) obvio lo que está sucediendo, por lo que para las API y similares donde la claridad es una gran preocupación, ¿los punteros no son más apropiados que las referencias? ¿Eso significa que las referencias solo deben usarse cuando sea necesario (por ejemplo operator++
)? ¿Hay problemas de rendimiento con uno u otro?
EDITAR (ACTUALIZADO):
Además de permitir valores NULL y tratar con matrices sin procesar, parece que la elección se reduce a preferencias personales. Acepté la respuesta a continuación que hace referencia a la Guía de estilo C ++ de Google , ya que presentan la opinión de que "las referencias pueden ser confusas, ya que tienen una sintaxis de valor pero una semántica de puntero".
Debido al trabajo adicional requerido para desinfectar los argumentos del puntero que no deberían ser NULL (por ejemplo add_one(0)
, llamará a la versión del puntero y se interrumpirá durante el tiempo de ejecución), tiene sentido desde una perspectiva de mantenimiento usar referencias donde un objeto DEBE estar presente, aunque es una pena perder la claridad sintáctica
add_one(a);
no está claro si se a
va a modificar? Dice justo en el código: agregue uno .
addOneTo(...)
. Si eso no es lo que quieres hacer, solo mira la declaración.