2017-06-06 1 views
27

Zum BeispielWenn der Dereferenzierungsoperator (*) überlastet ist, ist die Verwendung von * davon betroffen?

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? 
     } 
} 

Wenn *this landet this zu einem string anstelle eines Person dereferencing, ist es eine Abhilfe, die die Verwendung von * als Dereferenzierungsoperator außerhalb der Klasse unterhält?

Es wäre ein ziemliches Hindernis, wenn ich * nicht überlasten könnte, ohne die Verwendung von *this aufzugeben.

+23

Die Überlastung gilt für Person-Objekte. Aber 'das' ist ein Personen * -Zeiger *. – Galik

+1

@Galik Dieser Kommentar sollte eine (akzeptierte) Antwort sein. – YSC

Antwort

41

Wenn *this landet this in einen String statt eines Person dereferencing, ist es eine Abhilfe, die die Verwendung von * als Dereferenzierungsoperator außerhalb der Klasse unterhält?

No. *this wird Person&Person const& oder in Abhängigkeit von der Funktion. Die Überlast bezieht sich auf Person Objekte, nicht auf Zeiger auf Person Objekte. this ist ein Zeiger auf ein Person Objekt.

Wenn Sie:

Person p; 
auto v = *p; 

Dann wird die operator* Überlastung genannt wird.

die operator* Überlastung nennen this verwenden, werden Sie this->operator*() oder **this verwenden.

+3

Schlage vor, dass du @ Galiks Erklärung in deine Antwort einbaust. – einpoklum

+0

@einpoklum, ausgezeichneter Vorschlag. –

12

Sie benötigen ein Objekt der Klasse und nicht den Zeiger auf das Klassenobjekt, um den überladenen Operator * aufzurufen.

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. 

Gleiches ist der Fall mit this Zeiger. Zum Aufrufen * operator mit this Zeiger, werden Sie zu dereferenzieren haben zweimal:

std::string str = *(*this); 
Verwandte Themen