Uno de los mayores beneficios de las referencias sobre los punteros es una mayor simplicidad y legibilidad. Como siempre, cuando simplifica algo, lo hace más fácil de usar, pero a costa de la flexibilidad y el control que obtiene con las cosas de bajo nivel (como han mencionado otras personas).
Los punteros a menudo son criticados por ser "feos".
class* myClass = new class();
Ahora, cada vez que lo use, primero debe eliminar la referencia
myClass->Method() or (*myClass).Method()
A pesar de perder algo de legibilidad y agregar complejidad, las personas aún necesitaban usar punteros a menudo como parámetros para poder modificar el objeto real (en lugar de pasar por valor) y para obtener una ganancia de rendimiento al no tener que copiar objetos grandes.
Para mí, esta es la razón por la que las referencias 'nacieron' en primer lugar para proporcionar el mismo beneficio que los punteros pero sin toda esa sintaxis de punteros. Ahora puede pasar el objeto real (no solo su valor) Y tiene una forma más legible y normal de interactuar con el objeto.
MyMethod(&type parameter)
{
parameter.DoThis()
parameter.DoThat()
}
Las referencias de C ++ difieren de las referencias de C # / Java en que una vez que le asigna un valor que era, no puede reasignarlo (y debe asignarse cuando se declaró). Esto era lo mismo que usar un puntero constante (un puntero que no se podía volver a apuntar a otro objeto).
Java y C # son lenguajes modernos de muy alto nivel que limpiaron muchos de los líos que se habían acumulado en C / C ++ a lo largo de los años y los punteros eran definitivamente una de esas cosas que necesitaban ser 'limpiadas'.
En la medida en que su comentario acerca de conocer los punteros lo convierte en un programador más fuerte, esto es cierto en la mayoría de los casos. Si sabe 'cómo' funciona algo en lugar de simplemente usarlo sin saberlo, diría que esto a menudo puede darle una ventaja. La cantidad de ventaja siempre variará. Después de todo, usar algo sin saber cómo se implementa es una de las muchas bellezas de OOP e Interfaces.
En este ejemplo específico, ¿qué le ayudaría saber sobre punteros con las referencias? Comprender que una referencia de C # NO es el objeto en sí, sino que apunta al objeto, es un concepto muy importante.
# 1: NO está pasando por valor
Bueno, para empezar, cuando usa un puntero, sabe que el puntero contiene solo una dirección, eso es todo. La variable en sí está casi vacía y por eso es tan agradable pasarla como argumentos. Además de la ganancia de rendimiento, está trabajando con el objeto real, por lo que los cambios que realice no son temporales
# 2: Polimorfismo / Interfaces
Cuando tienes una referencia que es un tipo de interfaz y apunta a un objeto, solo puedes llamar a métodos de esa interfaz aunque el objeto tenga muchas más habilidades. Los objetos también pueden implementar los mismos métodos de manera diferente.
Si comprende bien estos conceptos, no creo que se esté perdiendo demasiado por no haber utilizado punteros. C ++ se usa a menudo como lenguaje para aprender a programar porque a veces es bueno ensuciarse las manos. Además, trabajar con aspectos de nivel inferior te hace apreciar las comodidades de un lenguaje moderno. Comencé con C ++ y ahora soy un programador de C # y siento que trabajar con punteros en bruto me ha ayudado a comprender mejor lo que sucede debajo del capó.
No creo que sea necesario que todos comiencen con punteros, pero lo importante es que comprendan por qué se usan referencias en lugar de tipos de valor y la mejor manera de entenderlo es mirar a su ancestro, el puntero.