Der this-Pointer

Innerhalb einer Methode kann an auf die eigenen Member direkt mit ihrem Namen zugreifen. Muss man allerdings eine Funktion (oder Methode einer anderen Klasseninstanz) rufen und die eigene Klasseninstanz als Parameter übergeben, so übergibt man this. this ist ein Schlüsselwort von C++ und ist immer ein konstanter Pointer auf die eigene Instanz - entsprechend ist der Typ von this immer der Typ, dem die Methode zugehört. Bei Point::Print ist this also vom Typ Point *const.

Da this ein Zeiger auf die eigene Instanz ist, kann mit this ebenso auf die eigenen Variablen zugegriffen werden:

void Point::Print( void )
{
  printf( "Point: %d/%d\n", this->XPosition, this->YPosition );
}

Dies ist gleichwertig mit der Lösung zuvor, jedoch empfinden manche Entwickler diese Schreibweise als leserlicher, weil explizit gesagt wird, dass es sich um Membervariablen aus dieser Instanz handelt.

Der Hintergedanke

Beim klassenorientiertern Programmieren ändert sich zunächst noch nicht viel: Im Quelltext rufen wir mit der Klasse nun

pointVariable.Print();

statt wie bisher in C:

Print( pointVariable );

Aber diese kleine Änderung erlaubt uns zum einen jeder Klasse eine eigene Print-Methode zu schreiben:

pointVariable.Print();
rectangleVariable.Print();
circleVariable.Print();

Während die Programmierung in C den Schwerpunkt auf die Funktionen legt, die irgendwelche Daten erhalten, hat sich herausgestellt, dass die Funktionen zwar wichtig sind, aber noch wichtiger sind die Daten. Bei der Programmierung in C spielte es noch keine große Rolle, wie man die Daten anordnet. Die klassenorientierte Programmierung legt nun den Schwerpunkt auf die Organisation der Daten und Funktionen werden zu Methoden, die Daten modifizieren. Man fügt also die Organisation der Daten und die Funktionen, um Daten dieses Datentyps zu verarbeiten zusammen. Statt Funktionen zu rufen, die Daten verändern, wählt man Daten aus, die über Methoden verändert werden.

Technisch besteht hier kein Unterschied, doch steigt die Änderung der Perspektive häufig auch die Art und Weise, wie Programmcode angeordnet wird. Probleme werden klassenintern gelöst - für andere Klassen ist dabei egal, wie eine andere Klasse ein Problem löst - solange die Methode existiert, die das Problem löst, muss sich sonst niemand darüber mehr Gedanken machen.

Klassenorientiertes Programmieren hilft dabei, Probleme in Teilprobleme zu zerteilen. So wird im nachfolgenden Kapitel der Code für die Ausgabe eines Rechtecks geschrieben. Ein Rechteck besteht aus zwei Punkten. Wie ein Punkt ausgegeben wird muss das Rechteck nicht interessieren, es verwendet einfach die Methode Print() der beiden Punkte. Das Problem 'Wie gebe ich ein Rechteck aus?' wird damit zum Problem 'Wie gebe ich zwei Punkte aus?' und das Problem 'Wie gebe ich einen Punkt aus?' wurde ja bereits gelöst.