c++ - ¿Es posible obtener la dirección del puntero ''this''?
reference rvalue-reference (4)
Me pregunto cuál puede dar la dirección de
this
? ¿O ambos están equivocados?
Tampoco lo es la dirección de
this
, porque la máquina abstracta de C ++ no define una dirección para ello.
this
es como
0
No puede obtener la dirección de 0, no es una entidad con almacenamiento, solo algo de valor.
Entonces que hace esto?
int const& i = 0;
Crea un objeto temporal, lo inicializa con 0 y, a continuación, le enlaza la referencia.
Lo mismo ocurre exactamente en su código.
Se crean referencias a diferentes objetos temporales que mantienen el
valor
de
this
.
this
es una palabra clave que representa la dirección del objeto para el que se está ejecutando la función miembro.
La máquina abstracta de C ++ no requiere que ocupe almacenamiento, por lo que siempre (lógicamente) es solo un valor simple, como 0.
Hay mérito para no requerir
this
para ocupar el almacenamiento.
Permite que C ++ se implemente sobre una ABI donde
this
se pasa en un registro (algo que normalmente no es direccionable).
Si
&this
tuviera que estar bien definido, es decir, si tuviera que ser direccionable, impediría que una implementación usara un registro para pasar la dirección.
El estándar C ++ generalmente apunta a no atar implementaciones de esa manera.
Leí que
this
es un rvalor y no podemos obtener su dirección aplicando
&this
.
En mi código, he intentado usar un enlace de referencia para
this
.
Me pregunto de qué manera va a dar la dirección de
this
?
O ambos están equivocados?
¿Qué es exactamente
this
?
¿Un lvalue, un rvalue, una palabra clave o algo más?
void MyString::test_this() const{
std::cout << "this: " << this << std::endl;
const MyString * const& this_ref = this;
std::cout << "thie_ref: " << &this_ref << std::endl;
const MyString * const&& this_right = this;
std::cout << "thie_right: " << &this_right << std::endl;
}
//this: 00CFFC14
//thie_ref: 00CFFB14
//thie_right: 00CFFAFC
La palabra clave
this
comporta esencialmente como
&__self
donde
__self
es un lvalue que designa el objeto en el que se ejecuta la función miembro (el
*this
objeto) excepto que no se usa un
operator&()
sobrecargado
operator&()
.
Entonces,
&this
significaría
&&__self
que obviamente no tiene sentido, no puede tomar la dirección de una dirección, al igual que no puede tomar la dirección de un valor de retorno escalar de una función:
int fi();
int *fpi();
Tanto
&(fi())
como
&(fpi())
son ilegales, ya que el rvalue devuelto es un escalar (probablemente almacenado en un registro) y
como un valor escalar puro no tiene una dirección
.
Lo que se entiende por "no puedes tomar la dirección de
this
" es que no puedes escribir
&this
.
Usted está solicitando la dirección
representada
por
this
puntero, ¿verdad?
Esto es, lo que hace tu primera salida.
this
sí no se materializa como un puntero, como p
MyString* x
ej.
MyString* x
lo estaría.
Aquí,
x
sí tiene una ubicación en la memoria y puedes hacer algo.
como
&x
.
Esto no es posible para
this
.
La respuesta a su última pregunta es: sí,
this
es una palabra clave.
La expresión
this
es una expresión primaria.
Puede leer sobre esto en la Sección
[expr.prim.this]
del estándar C ++.
this
es un puntero que contiene la dirección al
current object
.
No es una variable que se almacena en algún lugar (o incluso se puede cambiar), es una palabra clave especial con propiedades especiales.
Si desea saber la dirección del "objeto actual", simplemente puede mostrar como se muestra a continuación en el programa:
#include<iostream>
using namespace std;
class Test
{
public:
void fun()
{
cout << "Address of this :: " << this << endl;
void *ptr = this;
cout << "Addrss of ptr :: " << ptr << endl;
}
};
int main()
{
Test obj;
cout << "Address of obj :: " << &obj << endl;
obj.fun();
return 0;
}
El programa anterior produce una salida inferior:
Dirección de obj :: 0x7fffef913627
Dirección de este :: 0x7fffef913627
Addrss de ptr :: 0x7fffef913627
¡Espero que ayude!