Seite 1 von 1

Fragen zum this Zeiger

Verfasst: Di Jan 03, 2012 10:45 pm
von gizno82
Hallo Leute,

Worin liegt bei diesen code schnipseln der Unterschied ?

Code: Alles auswählen

int node::getData(void)
{
	return this->data;
}

Code: Alles auswählen

int node::getData(void)
{
	return node.data;
}
eigentlich ist es doch egal ob man per this zeiger auf data zugreif oder
über den . Was ist professioneller

Re: Fragen zum this Zeiger

Verfasst: Di Jan 03, 2012 11:06 pm
von Kerli
Bitte für Code auch Code-Tags verwenden...

Folgende Schnipsel sind gleichwertig, da innerhalb einer Klasse der Zugriff per this optional ist (ausgenommen bei Namenskollisionen)

Code: Alles auswählen

int node::getData(void)
{
return this->data;
}

Code: Alles auswählen

int node::getData(void)
{
return data;
}
Folgender Code wird jedoch nicht kompilieren:

Code: Alles auswählen

int node::getData(void)
{
return node.data;
}
node ist ja vermutlich der Klassenname und keine Instanz der Klasse, somit kann man auch nicht den . Operator anwenden. Die einzige Möglichkeit node einzubauen wäre:

Code: Alles auswählen

int node::getData(void)
{
return node::data;
}
Das kann nützlich sein bei der Verwendung von Vererbung nützlich sein, ist ansonsten aber völlig überflüssig.

Re: Fragen zum this Zeiger

Verfasst: Di Jan 03, 2012 11:25 pm
von gizno82
Also wenn man in einer Methode auf ein Klassenelement zugreifen möchte, immer schön den this-> Zeiger benutzen.
Um deutlich zu machen, das man auf ein Element genau dieser Klasse zugreifen möchte.
Benutzt man den this-> Zeiger nur aus Gründen der Übersichtlichkeit oder gibt es noch andere Gründe ?

Re: Fragen zum this Zeiger

Verfasst: Di Jan 03, 2012 11:36 pm
von Kerli
gizno82 hat geschrieben:Also wenn man in einer Methode auf ein Klassenelement zugreifen möchte, immer schön den this-> Zeiger benutzen.
Das ist vermutlich Geschmackssache, aber ich verwende es möglichst gar nicht und habe es auch nur sehr selten gesehen. Es bringt eigentlich keinen Mehrwert und ist nur mehr zu Tippen. Der einzige Vorteil wenn man es konsequent durchzieht ist Member auf den ersten Blick identifizieren zu können. Dazu verwende ich aber ein _ als erstes Zeichen des Namens und nicht den Zugriff über this->.
gizno82 hat geschrieben:Benutzt man den this-> Zeiger nur aus Gründen der Übersichtlichkeit oder gibt es noch andere Gründe ?
Der einzige andere Grund wäre auf einen verdeckten Namen zuzugreifen, also zb:

Code: Alles auswählen

void node::setData(int data)
{
  this->data = data; // data ohne this-> meint den Parameter data, der die Membervariable überdeckt (shadowed) und deshalb über this->data zugegriffen werden muss.
}

Re: Fragen zum this Zeiger

Verfasst: Mi Jan 04, 2012 2:23 pm
von Xin
gizno82 hat geschrieben:Also wenn man in einer Methode auf ein Klassenelement zugreifen möchte, immer schön den this-> Zeiger benutzen.
this ist ein Zeiger auf die aktuelle Instanz. In einer Methode, befindet man sich grundsätzlich in einer "dieser" Instanz. Damit ist "member" der Name eines Members "dieser" Instanz und "this->member" dasselbe mit mehr Prosa. Ich benutze this eigentlich nur, wenn ich zum Beispiel an einen Operator heranmöchte:

Code: Alles auswählen

return (*this)[ index ];
genauso gut ist aber auch

Code: Alles auswählen

return operator[]( index );
this brauchst Du vorrangig, um fremde Methoden aufzurufen und ihnen "diese" Instanz mitzugeben.

Ich selbst benutze "this->" nicht, trotzdem kann ich von der Verwendung von "this->" nicht wirklich abraten, da es den Zugriff auf die Membervariable klar beschreibt, im Gegensatz zu globalen-, lokalen- oder Parametervariablen.
gizno82 hat geschrieben:Um deutlich zu machen, das man auf ein Element genau dieser Klasse zugreifen möchte.
Benutzt man den this-> Zeiger nur aus Gründen der Übersichtlichkeit oder gibt es noch andere Gründe ?
Ich kenne niemanden, der es benutzt.

Es zu benutzen würde in meinen Augen von hoher Disziplin zeugen. Wird eine Membervariable aber irgendwann zum Parameter oder zur lokalen Variablen, bzw. eine solche zur Membervariablen, bedeutet das viel umzuschreiben. Damit wird die Sache schnell inkonsistent, weil die Verwendung nicht verpflichtend ist. Also rate ich doch vorsichtig davon ab. ^^

Kerlis Beispiel mit this->data halte ich für eine Falle. Eine Variable sollte nie wie eine Member heißen. Wird die Funktion erweitert, besteht große Verwechslungsgefahr. Statt des Symptoms sollte man das Problem lösen und den Parameter umbenennen.