den this-zeiger "braucht" man nicht wirklich da der compiler an dem namen implizit in der regel sehr gut erkennt welche variable gemeint ist. es gibt situationen wo es sich nicht vermeiden lässt, this explizit hinzuschreiben, aber das sind dann fälle die sich vermeiden ließen wenn die variablen gescheit benannt wären. im konstruktor kommt sowas manchmal vor:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
|
class Point {
int x, y;
public:
Point(int x, int y);
// ...
};
Point::Point(int x, int y) {
this->x = x;
this->y = y;
}
|
In diesem Fall ist ein einfaches x doppeldeutig. Das this-> sagt explizit dass einmal die Objektvariable gemeint ist. Ansonsten nimmt der Compiler immer das lokalste.
Btw würde ich hier Initialisierungslisten verwenden aber das ist ne andere Baustelle.
Pointer ersparen manchmal Arbeit, machen aber eigentlich immer dem Programmtext komplizierter (manche würden sagen "schöner"):
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
int arr[10];
int sum = 0;
for (unsigned int i=0; i<10; i++) sum += arr[i];
// ausgabe etc.
sum = 0;
for (int* p = arr[0]; p < arr[10]; ++p) sum += *p;
|
Bei der oberen Schleife mit normaler Zählvariable hast du für jeden Schleifendurchlauf
1* i inkrementieren
1* i mit 10 vergleichen
1* Adresse von arr + i berechnen
1* berechnete Adresse dereferenzieren um aktuelles Array-Element zu erhalten
1* aufaddieren
Bei der unteren Schleife hast du "nur":
1* p inkrementieren
1* p mit Ende des Arrays vergleichen
1* p dereferenzieren
1* aufaddieren
Insgesamt ist es also 1 Schritt weniger. Bei komplexeren Konstruktionen kann das auch mehr Arbeit einsparen. Allerdings kann man sich streiten ob das den Aufwand rechtfertigt, zumal der Compiler das selbst auch noch ganz gut optimiert.
//Ergänzung:
Prinzipiell kann man auch ohne Pointer programmieren wie ziemlich viele andere Programmiersprachen zeigen. Wie man ein Problem konkret löst hängt halt immer vom eigenen Geschmack ab. In einigen Fällen ermöglichen Pointer sehr elegante Lösungen. Wenn du schon etwas weiter bist wirst du vielleicht schon über Threads gestolpert sein. Je nach Art wie man einen Thread erzeugt gibt man ihm meistens einen Pointer auf die Funktion die er aufrufen soll und ein Pointer auf Daten die er der Funktion übergeben soll. Das macht die Sache sehr flexibel. Wollte man dies ohne Pointer bewerkstelligen bräuchte man einen Funktor für die Funktion und ein Objekt (beides z.B. per Referenz übergeben) welches die Daten kapselt. Das ist dann mehr Schreibarbeit, dafür aber streng objektorientiert (viele finden so ein Programmaufbau sauberer).
Gruß,
Dennis-.-