La dificultad es que una referencia en C ++ no puede estar vacía.
A todos los defensores de los lenguajes de GC como Java les gusta criticar a C ++ diciendo “¿Punteros? ¡Eww! “, La realidad es que las referencias de Java son en su mayoría como punteros C ++, no referencias C ++ (* gasp *). La única ventaja real de facilidad de uso en las referencias de Java sobre los punteros de C ++ es
- La sintaxis del descriptor de acceso: el hecho de que una referencia de Java sea un puntero queda oculto por el hecho de que el operador del descriptor de acceso “.” Desreferencia internamente cuando el operando es una referencia, ocultando efectivamente su “puntero-ness”
- La función del recolector de basura para asegurarse de no tener que limpiar su memoria de almacenamiento dinámico. Pero esto no tiene nada que ver con que sea una referencia en lugar de un tipo de puntero. El hecho de que la variable que contiene un objeto en Java es un tipo complejo que facilita la recolección y reflexión de basura es una peculiaridad de Java en comparación con C ++, donde dicha variable es solo la memoria real, y si desea esos servicios, debe preguntar para ellos (use punteros inteligentes).
Las referencias de Java son anulables. Por lo tanto, deben verificarse como nulos y, por lo tanto, su código puede tener una excepción nula si accede sin verificar primero. ¡Eso es simplemente un puntero con un recolector de basura y una sintaxis azucarada!
En realidad, es bastante fácil crear un contenedor (no especificó de qué tipo) si lo diseña con la idea de que una referencia no puede ser nula. Esto significa que no se pueden borrar, pero también significa que no se pueden crear antes de tiempo, que es donde el almacenamiento en matriz se vuelve problemático. Si desea un contenedor de listas de referencias, puede escribir una seleccionando usar una lista vinculada. Ahora cada referencia se asigna según sea necesario y se puede inicializar correctamente. Por supuesto, tendrá que usar punteros internamente para implementar la lista enlazada.
Ahora es posible que se esté refiriendo a la implementación de un contenedor de referencia que sigue los patrones STL. Esto es problemático, tanto por el problema de nulos discutido, como porque no se puede sobrecargar el operador “.” En C ++. Los contenedores STL siguen un patrón que permite a los iteradores que pueden ser desreferenciados acceder al objeto mismo. Esto se hace sobrecargando “*” y “->”, pero para una referencia se sobrecargaría “.” En su lugar. Eso no está permitido porque, como afirma Bjarne Stroustroup, no pudo encontrar la manera de crear un “.” Que no permitiera interminables casos de recursión (la función de operador de punto implica un operador de punto adicional, que llamaría el mismo función, etc.) Sin embargo, Bjarne ahora ha declarado que tiene una solución para esto y una adición que permite que esto sea posible para C ++.