referencia - punteros por parametro c++
¿Por qué ''esto'' es un puntero y no una referencia? (4)
Cuando el lenguaje estaba evolucionando por primera vez, en versiones anteriores con usuarios reales, no había referencias, solo apuntadores. Las referencias se agregaron cuando se agregó la sobrecarga del operador, ya que requiere referencias para trabajar de manera consistente.
Uno de los usos de this
es que un objeto obtenga un puntero a sí mismo. Si fuera una referencia, tendríamos que escribir &this
. Por otro lado, cuando escribimos un operador de asignación, tenemos que return *this
, que se vería más simple ya que return this
. Entonces, si tuviera una lista en blanco, podría argumentar de cualquier manera. Pero C ++ evolucionó gradualmente en respuesta a los comentarios de una comunidad de usuarios (como las cosas más exitosas). El valor de la compatibilidad con versiones anteriores supera totalmente las ventajas / desventajas menores que se derivan de que se trata de una referencia o un puntero.
Estaba leyendo las respuestas a esta pregunta C ++ pros y contras y tengo esta duda al leer los comentarios.
los programadores frecuentemente encuentran confuso que "esto" es un puntero pero no una referencia. otra confusión es por qué "hola" no es del tipo std :: string pero se evalúa como una const * (puntero) (después de la matriz a la conversión del puntero) - Johannes Schaub - litb 22 de diciembre de 2008 a las 1:56
Eso solo muestra que no usa las mismas convenciones que otros lenguajes (posteriores). - le dorfier 22 de diciembre de 2008 a las 3:35
Sin embargo, yo llamaría al "esto" algo bastante trivial. Y uy, gracias por detectar algunos errores en mis ejemplos de comportamiento indefinido. :) Aunque no entiendo qué información sobre el tamaño tiene que ver con nada en el primero. Un puntero simplemente no puede apuntar fuera de la memoria asignada - jalf 22 de diciembre de 2008 a 4:18
¿Es esto un poiner constante? - Yesraaj 22 de diciembre de 2008 a las 6:35
esto puede ser constante si el método es const int getFoo () const; <- en el ámbito de getFoo, "esto" es constante y, por lo tanto, es de solo lectura. Esto evita errores y proporciona cierto nivel de garantía a la persona que llama que el objeto no cambiará. - Doug T. Dic 22 ''08 a las 16:42
no puedes reasignar "esto". es decir, no puede hacer "this = & other;" porque es un valor r. pero esto es de tipo T *, no de tipo T const. es decir, es un puntero no constante. si estás en un método const, entonces es un puntero a const. T const. pero el puntero en sí no está en contraste - Johannes Schaub - litb 22 de diciembre de 2008 a las 17:53
piense en "esto" así: # defina esto (this_ + 0) donde el compilador crea "this_" como un puntero al objeto y convierte "this" en una palabra clave. no puedes asignar "esto" porque (this_ + 0) es un valor r. por supuesto que no es así (no existe tal macro), pero puede ayudar a entenderlo - Johannes Schaub - litb 22 de diciembre de 2008 a las 17:55
Mi pregunta es, ¿por qué this
es un puntero a no una referencia? ¿Alguna razón en particular para convertirlo en un puntero?
Algunos argumentos adicionales sobre por qué this
ser una referencia tendría sentido:
- Considere el
Item 1
deMore Effective C++
: use referencias cuando se garantice que tenemos un objeto válido, es decir, no un NULL (mi interpretación). - Además, las referencias se consideran más seguras que los punteros (porque no podemos atornillar la memoria con un puntero extraviado).
- En tercer lugar, la sintaxis para acceder a las referencias (
.
) Es un poco más agradable y más corta que acceder a los punteros (->
o(*)
).
El estándar de C ++ establece que
9.3.2 / 1
En el cuerpo de una función miembro no estática (9.3), la palabra clave this es una expresión non-lvalue cuyo valor es la dirección del objeto para el que se llama a la función. El tipo de esto en una función miembro de una clase X es X *. Si la función miembro se declara const, el tipo de esto es const X *, si la función miembro se declara volátil, el tipo de esto es volátil X *, y si la función miembro se declara const volátil, el tipo de esto es const volátil X *.
Pero en otras referencias, se encontró algo más ... por lo que alguien tomó la iniciativa y le lanzó un correo al Sr. Stroustrup . La conversación que siguió se puede encontrar here .
Independientemente de cómo llegamos aquí, creo que es una suerte que este sea un puntero y no una referencia, ya que esto le ayuda a "tener sentido" para poder eliminarlo :
void A::f () {
delete &this;
}
Creo que este es un caso donde sin ser necesariamente por diseño, C ++ es mejor de lo que es.
Un poco tarde para la fiesta ... Directamente de la boca del caballo, esto es lo que Bjarne Stroustrup tiene que decir (que se repite esencialmente o se toma del libro "Diseño y evolución de C ++"):
¿Por qué "esto" no es una referencia?
Porque "esto" se introdujo en C ++ (realmente en C con clases) antes de que se agregaran las referencias. Además, elegí "esto" para seguir el uso de Simula, en lugar del uso (posterior) de Smalltalk del "yo".