[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