2010-05-01 9 views
20

Ich verstehe was this tut, aber was ist der Unterschied zwischen *this und this?* Dies ist das in C++

Ja, ich habe über *this in meinem Textbuch gegoogelt und gelesen, aber ich es einfach nicht bekommen ...

Antwort

44

this ist ein Zeiger, und *this ist ein dereferenzierten Zeiger.

Wenn Sie eine Funktion hatte, die this zurückgekehrt, wäre es ein Zeiger auf das aktuelle Objekt, während eine Funktion, die *this zurück einen „Klon“ des aktuellen Objekts sein würde, auf dem Stack zugeordnet - es sei denn, Sie habe den Rückgabetyp der Methode angegeben, um eine Referenz zurückzugeben.

Ein einfaches Programm, das die Differenz zwischen dem Betrieb auf Kopien und Verweise zeigt:

#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; 
} 

Ausgang:

1 
1 
2 
3 

Sie können sehen, dass, wenn wir auf einem arbeiten unser lokalen Objekt kopieren Die Änderungen werden nicht beibehalten (weil es sich um ein anderes Objekt handelt), aber die Operation führt fort.

+1

Ich validiere hier: returning * Dies liefert nicht die Referenz des Objekts, sondern eine Kopie des Objekts? –

+0

Sie haben Recht zu fragen. * Dies gibt tatsächlich einen Verweis auf das Objekt zurück. Wenn Sie beispielsweise den Operator [] in Ihrer Klasse überladen, können Sie innerhalb der Klasse (* this) [] anstelle von operator [] verwenden. – ypnos

+5

Mark, dein Beispiel ist irreführend. Probieren Sie Foo & get_copy() {return * this; }. Dann sehen Sie, dass dies tatsächlich eine Referenz ist. – ypnos

8

this ist ein Zeiger auf die Instanz der Klasse. *this ist eine Referenz zu demselben. Sie unterscheiden sich in der gleichen Weise wie int* i_ptr und int& i_ref sind unterschiedlich.

-4

Es gibt keinen wirklichen Unterschied, this->foo() ist das gleiche wie (*this).foo().

+0

ahh ja, schätze ich hätte das im Compiler zuerst nachprüfen sollen :) –