Fragen zum this Zeiger

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
gizno82
Beiträge: 46
Registriert: Sa Dez 19, 2009 4:03 pm

Fragen zum this Zeiger

Beitrag von gizno82 » Di Jan 03, 2012 10:45 pm

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
Zuletzt geändert von Kerli am Di Jan 03, 2012 11:06 pm, insgesamt 1-mal geändert.
Grund: Code Tags

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Fragen zum this Zeiger

Beitrag von Kerli » Di Jan 03, 2012 11:06 pm

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.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

gizno82
Beiträge: 46
Registriert: Sa Dez 19, 2009 4:03 pm

Re: Fragen zum this Zeiger

Beitrag von gizno82 » Di Jan 03, 2012 11:25 pm

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 ?

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Fragen zum this Zeiger

Beitrag von Kerli » Di Jan 03, 2012 11:36 pm

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.
}
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Fragen zum this Zeiger

Beitrag von Xin » Mi Jan 04, 2012 2:23 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten