2010-05-01 8 views

Répondre

44

this est un pointeur et *this est un pointeur déréférencé.

Si vous aviez une fonction qui est revenu this, ce serait un pointeur vers l'objet courant, tandis qu'une fonction qui est revenu *this serait un « clone » de l'objet courant, alloué sur la pile - à moins que vous ont spécifié le type de retour de la méthode pour renvoyer une référence.

Un programme simple qui montre la différence entre fonctionnement sur les copies et les références:

#include <iostream> 

class Foo 
{ 
    public: 
     Foo() 
     { 
      this->value = 0; 
     } 

     Foo get_copy() 
     { 
      return *this; 
     } 

     Foo& get_copy_as_reference() 
     { 
      return *this; 
     } 

     Foo* get_pointer() 
     { 
      return this; 
     } 

     void increment() 
     { 
      this->value++; 
     } 

     void print_value() 
     { 
      std::cout << this->value << std::endl; 
     } 

    private: 
     int value; 
}; 

int main() 
{ 
    Foo foo; 
    foo.increment(); 
    foo.print_value(); 

    foo.get_copy().increment(); 
    foo.print_value(); 

    foo.get_copy_as_reference().increment(); 
    foo.print_value(); 

    foo.get_pointer()->increment(); 
    foo.print_value(); 

    return 0; 
} 

Sortie:

1 
1 
2 
3 

Vous pouvez voir que lorsque nous fonctionnons sur une copie de notre objet local , les changements ne persistent pas (parce qu'il est un objet totalement différent), mais fonctionnant sur une référence ou pointeur ne les changements persistent.

+1

Je validation ici: retour * cela ne retourne pas la référence de l'objet, mais une copie de l'objet? –

+0

Vous avez raison de demander. * ceci renvoie en fait une référence à l'objet. Par exemple, si vous surchargez l'opérateur [] dans votre classe, vous pouvez utiliser la classe (* this) [] au lieu de operator []. – ypnos

+5

Mark, votre exemple est trompeur. Essayez Foo & get_copy() {return * this; } Alors vous voyez qu'en fait * ceci est une référence. – ypnos

8

this est un pointeur vers l'instance de la classe. *this est une référence au même. Ils sont différents de la même manière que int* i_ptr et int& i_ref sont différents.

-4

Il n'y a pas de différence réelle, this->foo() est le même que (*this).foo().

+0

ahh oui, je suppose que je devrais avoir jeté cela dans le compilateur d'abord pour vérifier :) –