005
21.01.2005, 10:37 Uhr
Th
|
Also, gestern hatte ich nicht mehr viel Zeit, es genauer zu erklären.
Wenn du eine Funktion definierst hast, die einen nicht-konstanten Zeiger oder Referenz auf einen Typ (z.B. string*, string& oder auch int *) als Parameter erwartet und übergibst dieser Funktion den Rückgabewert einer anderen Funktion, so wird hierfür vom Compiler ein temp. Objekt (namenlose Variable) angelegt, die nach dem Funktionsaufruf wieder zerstört wird (auf dem Stack), d.h. man kann zwar in der Funktion den Wert dann ändern, aber nach dem Funktionsaufruf wird dieses Objekt wieder gelöscht und die Wirkung ist gleich null. Es kommt hierbei zu keinem Absturz (außer die Funktion ist fehlerhaft).
Besser ist es bei STL-Objekten mit Referenzen zu arbeiten, also "func(string& s)", da diese Objekte selbst nur Wrapper für Zeiger sind. Aber wenn du in der Funktion den Wert NICHT ändern willst, dann definiere alle Parameter als "const string&". Alternativ kann man auch nur "string" schreiben, aber dann wird das gesamte Objekt mittels Defaultkonstruktor kopiert (bei STL-Objekten meist nur Zeiger kopieren), aber generell sollte man sich die "constness"-Programmierung angewöhnen (wie bei Nur-Lese-Methoden "const" angeben).
Man braucht Zeiger nur verwenden, wenn man explizit den NULL-Zeiger zulassen will, ansonsten besser Referenzen verwenden (vermeidet das lästige Dereferenzieren).
Beispiele: 1. mit Referenz:
C++: |
void func(string &s) { if(s.empty()) s += "Hello World or the whole Universe!"; }
|
2. mit Zeigern
C++: |
void func(string *s) { if(s->empty) (*s) += "Hello World or the whole Universe!"; }
|
Ich hoffe, dies führt nicht zu mehr Verwirrung... |