prefiero una referencia en lugar de un puntero cuando:
- No puede ser nulo
- No se puede cambiar (a apuntar a otra cosa)
- No debe ser borrado (por quienquiera que reciba el puntero)
Algunas personas dicen sin embargo que la diferencia entre una referencia y una referencia constante es demasiado sutil para muchas personas, y es invisible en el código que llama al método (es decir, si usted lee el código de llamada que pasa un parámetro por referencia, no puede ver si es una referencia const o non-const), y que por lo tanto debe convertirlo en un puntero (para hacerlo explícito en el código de llamada que ' re dando la dirección de su variable, y que por lo tanto el valor de su variable puede ser alterado por el destinatario).
yo personalmente prefiero una referencia, por la siguiente razón:
- creo que una rutina debe saber qué subrutina que está llamando
- Una subrutina no debe asumir nada acerca de lo que la rutina que está siendo llamado desde.
[1.] implica que hacer que la mutabilidad sea visible para la persona que llama no importa mucho, porque la persona que llama ya debe (por otros medios) comprender lo que hace la subrutina (incluido el hecho de que modificará el parámetro)
[2.] implica que, si se trata de un puntero, la subrutina debe considerar la posibilidad de que el parámetro sea un puntero nulo, que puede ser un código extra e IMO inútil.
Además, cada vez que veo un puntero, pienso, "¿quién va a eliminar esto y cuándo?", Así que siempre/cuando la propiedad/duración/eliminación no sea un problema, prefiero usar una referencia.
Por lo que vale, tengo la costumbre de escribir código const-correct: así que si declaro que un método tiene un parámetro de referencia no constante, el hecho de que no const es significativo. Si las personas no estuvieran escribiendo código const correcto, tal vez sería más difícil saber si un parámetro se modificará en una subrutina, y el argumento para otro mecanismo (por ejemplo, un puntero en lugar de una referencia) sería un poco más fuerte.
¿Tiene una referencia para Stroustrup que recomienda 2? Me parece recordar lo contrario. – luke
Como dice Stroustrup, GetFoo (& Data) es más obvio que GetFoo (Data), si la función debe cambiar el valor de los datos. Encontraré la cita exacta más tarde hoy ... – SadSido
Stroustrup lo recomienda en el libro TC++ PL. –