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 ...
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 ...
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.
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.
Es gibt keinen wirklichen Unterschied, this->foo()
ist das gleiche wie (*this).foo()
.
ahh ja, schätze ich hätte das im Compiler zuerst nachprüfen sollen :) –
Ich validiere hier: returning * Dies liefert nicht die Referenz des Objekts, sondern eine Kopie des Objekts? –
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
Mark, dein Beispiel ist irreführend. Probieren Sie Foo & get_copy() {return * this; }. Dann sehen Sie, dass dies tatsächlich eine Referenz ist. – ypnos