Подтвердить что ты не робот

Когда оператор разыменования (*) перегружен, используется ли использование * 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.

4b9b3361

Ответ 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);