Когда оператор разыменования (*) перегружен, используется ли использование * this?
Например,
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?
}
}
Если *this
заканчивается разыменование this
до string
вместо Person
, существует ли обходной путь, поддерживающий использование *
в качестве оператора разметки вне класса?
Было бы довольно затруднительным, если бы я не мог перегружать *
, не отказываясь от использования *this
.
Ответы
Ответ 1
Если *this
заканчивается разыменование this
для строки вместо Person
, существует ли способ обхода, который поддерживает использование *
в качестве оператора разметки вне класса?
Нет. *this
будет Person&
или Person const&
в зависимости от функции. Перегрузка применяется к объектам Person
, а не указателям на объекты Person
. this
- это указатель на объект Person
.
Если вы используете:
Person p;
auto v = *p;
Затем вызывается перегрузка operator*
.
Чтобы вызвать перегрузку operator*
с помощью this
, вам нужно будет использовать this->operator*()
или **this
.
Ответ 2
Вам нужен объект класса, а не указатель на объект класса, чтобы вызвать перегруженный оператор *
.
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.
То же самое происходит с указателем this
. Чтобы вызвать * operator
с указателем this
, вам придется разыгрывать дважды:
std::string str = *(*this);