c++ - significado - Cuando el operador de desreferencia(*) está sobrecargado, ¿el uso de*está afectado?
operadores de direccion en lenguaje c (2)
Por ejemplo,
class Person{
string name;
public:
T& operator*(){
return name;
}
bool operator==(const Person &rhs){
return this->name == rhs.name;
}
bool operator!=(const Person &rhs){
return !(*this == rhs); // Will *this be the string name or the Person?
}
}
Si *this
termina desreferenciando this
a una string
lugar de una Person
, ¿hay alguna solución que mantenga el uso de *
como un operador de eliminación de referencias fuera de la clase?
Sería un gran obstáculo si no pudiera sobrecargar *
sin renunciar al uso de *this
.
Si
*this
termina desreferenciandothis
a una cadena en lugar de unaPerson
, ¿hay alguna solución que mantenga el uso de*
como un operador de eliminación de referencias fuera de la clase?
No. *this
será Person&
/ Person const&
dependiendo de la función. La sobrecarga se aplica a los objetos Person
, no a los objetos Person
. this
es un puntero a un objeto Person
.
Si utiliza:
Person p;
auto v = *p;
Entonces, se llama a la sobrecarga del operator*
.
Para llamar a la sobrecarga del operator*
usando this
, tendrá que usar this->operator*()
o **this
.
Necesita un objeto de la clase en lugar del puntero al objeto de clase para invocar al operador *
sobrecargado.
Person *ptr = new Person;
Person p1 = *ptr; // does not invoke * operator but returns the object pointed by ptr
string str = *p1 // invokes the overloaded operator as it is called on an object.
Lo mismo es el caso con this
puntero. Para invocar al * operator
con this
puntero, tendrá que eliminar la referencia dos veces:
std::string str = *(*this);