C++ FAQ dice:¿Es realmente la mejor práctica preferir las referencias de C++ a los punteros en todas las situaciones?
“Utilizar referencias cuando se puede, y los punteros cuando tienen que hacerlo.”
Siento que no es tan fácil como se indicó anteriormente. Las razones por las que las referencias son generalmente mejores para los indicadores han sido bien discutidas. Así que me gustaría discutir casos especiales donde las referencias tienen sentido pero son muy inusuales y simplemente no me siento bien:
Para mí, el caso más obvio es su uso en estructuras de datos generales como un árbol o lista. Sus interfaces podrían ciertamente implementan utilizando referencias y sentirse más seguro, pero no he visto una sola aplicación que tomar ventaja de las referencias por ejemplo:
Node *parent = n.parent(); // parent might be unset -> pointer
Node &child = n.child(5); // child is always valid -> reference
Aunque podría parecer atractiva, que conduce a un código como éste:
if(parent == &child) ... // weird, unusual at least?
Me pregunto, ¿esto es lo que significa pure C++?
Cada vez que he intentado utilizar ciegamente referencias allí donde es posible, me he encontrado todo tipo de inconsistencias similares y terminó punteros de mezcla y referencias de diversas maneras feas.
Para concluir, ¿por qué el operador nuevo no devuelve en primer lugar una referencia a una nueva instancia en lugar de un puntero? (Y lanza en caso de error):
Node &n = new Node;
delete &n;
Es un ejemplo absurdo, pero no es que lo que sería “C++ puro”?
Te estás perdiendo el punto. Piense en la cita como "use almacenamiento automático cuando pueda, y almacenamiento dinámico (' nuevo') cuando sea necesario ". – ildjarn
Use lo que tenga sentido. Por lo general, eso significa punteros en la implementación de contenedores y referencias en el código del cliente. Además, nadie puede evitar que alguien escriba código ridículo, por lo que si alguien dice 'eliminar & x;', no hay mucho que pueda hacer. Debe suponer que sus clientes * desean * escribir programas correctos. Solo tienes que facilitarles las cosas. –
Las referencias son preferidas al pasar objetos a funciones también porque es más rápido debido a que no se invoca un constructor de copia. – chris