2017-06-06 17 views
27

Par exemple,Lorsque l'opérateur de déréférencement (*) est surchargé, l'utilisation de * est-elle affectée?

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 finit par déréférencement this à un string au lieu d'un Person, est-il une solution qui maintient l'utilisation de * comme opérateur de déréférencement en dehors de la classe?

Ce serait un obstacle si je ne pouvais pas surcharger * sans abandonner l'utilisation de *this.

+23

La surcharge applique aux objets personne. Mais 'ceci 'est une personne * pointeur *. – Galik

+1

@Galik ce commentaire devrait être une réponse (acceptée). – YSC

Répondre

41

Si *this finit par déréférencement this à une chaîne au lieu d'un Person, est-il une solution qui maintient l'utilisation de * comme opérateur de déréférencement en dehors de la classe?

n ° *this sera Person& ou Person const& selon la fonction. La surcharge s'applique aux objets Person et non aux pointeurs Person. this est un pointeur vers un objet Person.

Si vous utilisez:

Person p; 
auto v = *p; 

Ensuite, la surcharge operator* est appelée.

Pour appeler la surcharge operator* en utilisant this, vous devrez utiliser this->operator*() ou **this.

+3

Suggérez-vous d'incorporer l'explication de @ Galik dans votre réponse. – einpoklum

+0

@einpoklum, excellente suggestion. –

12

Vous avez besoin d'un objet de la classe plutôt que du pointeur vers l'objet de classe pour appeler l'opérateur surchargé *.

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. 

Identique au pointeur this. Pour appeler * operator avec pointeur this, vous devrez déréférencer deux fois:

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