Estaba leyendo las respuestas a esta pregunta C ++ pros y contras y obtuve esta duda mientras leía 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 de tipo std :: string sino que se evalúa como char const * (puntero) (después de la conversión de matriz a puntero) - Johannes Schaub - litb 22 de diciembre de 08 a 1:56
Eso solo muestra que no usa las mismas convenciones que otros lenguajes (posteriores). - le dorfier 22 de diciembre 08 a las 3:35
Sin embargo, yo llamaría a "esto" una cuestión bastante trivial. Y vaya, 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. Simplemente no se permite que un puntero apunte fuera de la memoria asignada
¿Es esto un puntero constante? - yesraaj 22 de diciembre '08 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 de 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á en un método const, entonces es un puntero para const. T const. pero el puntero en sí mismo no es constante - Johannes Schaub - litb 22 de diciembre de 08 a las 17:53
piense en "this" de esta manera: #define this (this_ + 0) donde el compilador crea "this_" como un puntero al objeto y convierte "this" en una palabra clave. no puede asignar "this" porque (this_ + 0) es un rvalue. por supuesto que no es así (no existe tal macro), pero puede ayudar a entenderlo - Johannes Schaub - litb 22 de diciembre de 08 a las 17:55
Mi pregunta es, ¿por qué this
un puntero no es una referencia? ¿Alguna razón particular para hacerlo un puntero?
Algunos argumentos adicionales por los que this
ser una referencia tendría sentido:
- Considere
Item 1
deMore Effective C++
: uso referencias cuando se garantiza que tenemos un objeto válido es decir, no un valor NULL (mi interpretación). - Además, las referencias se consideran más seguras que los punteros (porque no podemos arruinar la memoria con un puntero perdido).
- En tercer lugar, la sintaxis para acceder a las referencias (
.
) es un poco mejor y más corta que acceder a los punteros (->
o(*)
).
_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const { return this == NULL ? NULL : m_hWnd; }
this
siempre evalúatrue
?