Jede nicht-statische Memberfunktion erhält als versteckten Parameter einen Zeiger auf das Objekt, in dessen Kontext sie aufgerufen wurde. Dieser Zeiger wird this-Zeiger genannt. Er ist immer vom Typ 'Zeiger auf eigene Klasse'.
Sehen Sie sich einmal das nachfolgende Beispiel an. Dort wird eine minimale Klasse definiert, die nur aus einer einzigen Memberfunktion Anything(...) besteht.
|
#include <iostream> using std::cout; using std::endl; // Klassendefinition class Any { public: void Anything(); }; // Defínition der einzigen Memberfunktion void Any::Anything() { // Inhalt des this-Zeigers ausgeben cout << "this=" << this << endl; } // main() Funktion int main() { // 2 Objekte definieren Any obj1, obj2; cout << std::hex; // Adressen der Objekte ausgeben cout << "Adr. obj1=" << &obj1 << endl; cout << "Adr. obj2=" << &obj2 << endl; // this-Zeiger der Objekte ausgeben cout << "this-Zeiger ausgeben:\n"; obj1.Anything(); obj2.Anything(); } |
In main() werden zwei Objekte dieser Klasse definiert. Anschließend werden die Adressen beider Objekte ausgegeben, was letztendlich nichts anderes bedeutet, wie die Ausgabe der Zeiger auf diese Objekte.
Danach rufen beide Objekte ihre Memberfunktion Anything() auf. In dieser Memberfunktion wird dann der Inhalt des this-Zeigers ausgegeben. Und da dieser Zeiger laut obiger Aussage auf das aufrufende Objekt zeigt, werden hier die gleichen Adressen wie vorher in main() Funktion ausgegeben.
|
Adr. obj1=0016FE57 |
Vielleicht fragen Sie sich jetzt, für wofür dieser Zeiger eigentlich eingesetzt wird? Nun, dieser Zeiger wird immer dann verwendet, wenn ein Zeiger oder eine Referenz auf das aktuelle Objekt innerhalb einer Memberfunktion benötigt wird. Aber sehen wir uns dies am Besten anhand des Beispiels an.
|
|
Vordergrund: 0x112233, Hintergrund: 0x0000ff |
|
// Beispiel zum this-Zeiger // Zuerst Dateien einbinden #include <iostream> #include <iomanip> using std::cout; using std::endl; // Vorwärtsdeklaration wegen nachfolgender // Deklaration der Funktion DisplayMessage(...) class Window; // Funktionsdeklaration void DisplayMessage(const char* const pMsg, Window *pParent = NULL); // Klassendefinition class Window { // Fensterfarben unsigned long foreColor, backColor; public: // ctor Window(unsigned long fc, unsigned long bc); // Auslesen der Fensterfarben void GetColor(unsigned long &fc, unsigned long &bc); // Beliebige Memberfunktion void DoAnything(); }; // Definition der Memberfunktionen // Konstruktor, setzt die Fensterfarben Window::Window(unsigned long fc, unsigned long bc) { foreColor = fc; backColor = bc; } // Fensterfarben zurückliefern void Window::GetColor(unsigned long &fc, unsigned long &bc) { fc = foreColor; bc = backColor; } // Ausgabe einer Meldung void Window::DoAnything() { DisplayMessage("Fenstermeldung!",this); } // Funktion zur Ausgabe der Meldung void DisplayMessage(const char* const pMsg,Window *pParent) { unsigned long fc, bc; // Falls Aufruf der Funktion nicht von einem Fenster aus if (pParent == NULL) { // Standardfarben für Ausgabe verwenden fc = 0UL; bc = 0xFFFFFFUL; } else { // sonst Fensterfarben verwenden pParent->GetColor(fc, bc); } // Meldung ausgeben cout << std::hex << std::setfill('0'); cout << "Vordergrund: 0x" << std::setw(6) << fc; cout << ", Hintergrund: 0x" << std::setw(6) << bc << endl; cout << std::dec << std::setfill(' '); cout << "Text ist : " << pMsg << endl; } // main() Funktion int main() { // Fensterobjekt erstellen Window myWin(0x112233UL,0x0000FFUL); // Memberfunktion des Fensters aufrufen myWin.DoAnything(); // Meldung ausgeben DisplayMessage("Meldung von main()!"); } |
Auf eine Übung können wir hier getrost verzichten, da uns dieser Zeiger in den nachfolgenden Lektionen noch öfters begegnen wird.