Punteros vs. Refereces
Referencias son menos potentes que los punteros:
1) Una vez que se crea una referencia, no puede ser más tarde hizo para hacer referencia a otro objeto; no puede ser resecado Esto se hace a menudo con punteros.
2) Las referencias no pueden ser NULAS. Los punteros a menudo se hacen NULL para indicar que no están apuntando a ninguna cosa válida.
3) Una referencia debe inicializarse cuando se declara. No hay tal restricción con punteros
Debido a las limitaciones anteriores, referencias en C++ no se pueden utilizar para implementar estructuras de datos como lista enlazada, Árbol, etc. En Java, las referencias no tienen por encima de las restricciones, y se puede usar para implementar todas las estructuras de datos. Las referencias son más poderosas en Java, es la razón principal por la que Java no necesita punteros.
Las referencias son más seguros y más fáciles de usar:
1) más seguro: Desde las referencias deben ser inicializadas, referencias salvajes como punteros salvajes es improbable que existan. Todavía es posible tener referencias que no se refieran a una ubicación válida
2) Más fácil de usar: las referencias no necesitan que el operador de desreferenciación tenga acceso al valor. Se pueden usar como variables normales. El operador '&' solo es necesario en el momento de la declaración. Además, se puede acceder a los miembros de una referencia de objeto con el operador de punto ('.'), A diferencia de los punteros donde se necesita el operador de flecha (->) para acceder a los miembros.
Junto con las razones anteriores, hay pocos lugares como el argumento del constructor de copia donde no se puede usar el puntero. La referencia debe usarse para pasar el argumento en el constructor de copia. Del mismo modo referencias se deben utilizar para sobrecargar algunos operadores como ++.
Las referencias son por supuesto valiosas, pero vengo de C, donde los punteros están en todas partes. Uno tiene que ser competente con punteros primero para comprender el valor de las referencias. –
¿Cómo encaja esto con un objetivo como la transparencia referencial de la programación funcional? ¿Qué sucede si siempre quiere que las funciones devuelvan nuevos objetos y nunca mute el estado internamente, especialmente no de las variables pasadas a la función? ¿Hay alguna manera de que este concepto se use con punteros y referencias en un lenguaje como C++? (Nota, supongo que alguien ya tiene el objetivo de la transparencia referencial.No me interesa hablar sobre si es un buen objetivo o no.) – ely
Preferir referencias. Punteros de usuario cuando no tiene otra opción. – Ferruccio