[linux-l] Objektübergabe durch Referenz (was: Designfrage bzgl. Deckverwaltung)
Axel Weiß
aweiss at informatik.hu-berlin.de
Fr Nov 25 20:41:50 CET 2005
Frank Reker schrieb:
> retval = myfunc (&var);
> hierbei ist klar, dass ich eine referenz uebergebe, und var nachher
> einen anderen wert haben kann als vorher. bei:
Bei der nicht-const-Übergabe[tm] von Referenzen ist besondere Vorsicht
geboten. Beispiel:
class A{...};
class B{
public:
B(const A&)...
};
void f(B &b)...
f(.) möchte den Zustand des B-Objekts ändern. Weil B aber einen
Konstruktor hat, der eine A-Objektreferenz akzeptiert, ist folgendes
möglich:
A a;
f(a);
Welchen Zustand hat a jetzt? Garantiert den selben wie vor dem Aufruf von
f (was von f nicht beabsichtigt war). Bestenfalls bekommt man noch eine
Warnung zur Übersetzungszeit, die einen darauf hinweist, dass hier ein
temporäres Objekt erzeugt wird.
Bei größeren Projekten übergebe ich Referenzen nur const - im
Zweifelsfall wird dabei ein temporäres read-only Objekt erzeugt (via
automatischer Typkonversion), das keinen Schaden anrichten kann. Wenn
ich mich darauf verlassen will, dass eine Funktion/Methode ein
*lebendes* Objekt manipuliert, übergebe ich viel lieber Zeiger. Damit
hat man obiges Problem nämlich nicht.
Axel
Mehr Informationen über die Mailingliste linux-l