Forum: PC-Programmierung this Zeiger in c++ verstehen


von c++ anfänger (Gast)


Lesenswert?

Hallo,

this Zeiger liefert innerhalb einer Elementfunktion die Adresse des 
Objekts zurück, auf das sich die Elementfunktion bezieht.

gilt das auch für Konstruktoren? kann mir jemand anhand eines einfachen 
beispiel das Thema "this Zeiger" erklären, von Wikipedia werde ich nicht 
schlauer!

Danke im Voraus!

von Georg A. (georga)


Lesenswert?

> gilt das auch für Konstruktoren?

Klar, der Speicher für das Objekt muss vor dem Konstruktor-Call schon 
angelegt sein, sonst würde ja jegliche Member-Initialisierung darin in 
die Pampa gehen.

von Dr. Sommer (Gast)


Lesenswert?

Der Aufruf einer Member-Funktion in C++ funktioniert genauso wie der 
Aufruf einer normalen Funktion dessen 1. Parameter ein Pointer ist:
Die klassische C-Version
1
struct Test {
2
  int x;
3
};
4
void Test_Funktion (Test* this_) {
5
  this_->x = 7;
6
}
7
int main () {
8
  Test t;
9
  Test_Funktion (&t);
10
}
entspricht in C++ mit Member-Funktionen
1
class Test {
2
  public:
3
    int x;
4
    void Funktion () { this->x = 7; }
5
};
6
int main () {
7
  Test t;
8
  t.Funktion ();
9
}

Lediglich das this-> kann man in C++ weglassen, das "x" würde trotzdem 
gefunden.

Hier ein Beispiel wie die Adressen aussehen: http://ideone.com/JhAm9n
Man sieht, dass die Adresse von "this" der von "t" in main() entspricht 
(auf dem die Funktion aufgerufen wurde). Die Adresse der 1. 
Member-Variablen ist die selbe, da diese am Anfang der Instanz steht. 
Die 2. Member-Variable folgt darauf und hat daher eine größere Adresse.

von Dr. Sommer (Gast)


Lesenswert?

Dr. Sommer schrieb:
> entspricht in C++ mit Member-Funktionen
Typischerweise (abhängig vom ABI) entspricht das sogar exakt, d.h. es 
kommt der selbe Maschinen-Code heraus.

von Rolf Magnus (Gast)


Lesenswert?

Georg A. schrieb:
>> gilt das auch für Konstruktoren?
>
> Klar, der Speicher für das Objekt muss vor dem Konstruktor-Call schon
> angelegt sein, sonst würde ja jegliche Member-Initialisierung darin in
> die Pampa gehen.

Es sei aber erwähnt, daß man aufpassen muß. Da das Objekt ja noch nicht 
vollständig initialisiert ist, kann's Probleme geben, wenn man den 
Zeiger nach "draußen" gbit und dort an der Stelle dann sofort Zugriffe 
über den Zeiger macht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.