Dreierregel

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Die Dreierregel bezeichnet in der Programmiersprache C++ eine Faustregel, die empfiehlt, dass eine Klasse, die eines der folgenden drei Elemente definiert, auch die jeweils anderen beiden definiert werden sollten:[1]

Diese werden automatisch vom Compiler generiert, können aber mit einer explizit durch den Programmierer definierten Implementierung ersetzt werden. Wird das für eines dieser Elemente gemacht, so bedeutet das, dass die compilergenerierte Version des entsprechenden Elements den Anforderungen der Klasse nicht genügt. Daraus lässt sich schließen, dass das wahrscheinlich auch bei den anderen beiden Elementen der Fall ist.

Der Grund ist, dass compilergenerierte Elemente in vielen Fällen nicht ausreichen, um bestimmte Aufgaben zu erfüllen. Bspw. wenn die Klasse aus Objekten anderer Klassen zusammengesetzt ist, die ausschließlich von ihr verwendet werden (Komposition). Die compilergenerierte Variante kopiert dabei nur die Zeiger auf die Objekte (flache Kopie). Eine Manipulation des kopierten Objekts würde dann auch das Original verändern, da beide auf dieselben Objekte zugreifen. In einem solchen Fall ist der Kopierkonstruktor wichtig, um auch die Teilobjekte zu kopieren (tiefe Kopie). Ebenso wird beim Löschen des Objekts ein eigener Destruktor benötigt, um die Teilobjekte ebenfalls zu löschen.

Die Dreierregel ist keine Regel, die es ausnahmslos zu befolgen gilt, sondern eher eine Faustregel oder Empfehlung. Ein konkretes Beispiel bei welchem die Dreierregel nicht angewendet werden muss ist ein Referenzzähler. Beim Erzeugen (Standardkonstruktor), Kopieren (Kopierkonstruktor) und Zerstören (Destruktor) ändert sich die Anzahl der Objekte, nicht jedoch beim Zuweisen:

struct RefCounter
{
	static std::size_t n;
 
	RefCounter() // Standardkonstruktor
	{
		++n;
	}
	RefCounter(RefCounter const&) // Kopierkonstruktor
	{
		++n;
	}
	~RefCounter() // Destruktor
	{
		--n;
	}
 
	// Kein Zuweisungsoperator benötigt
	// RefCounter& operator= (RefCounter const&)
};

Seit dem Erscheinen von C++11 wird diese Regel zur Fünferregel, in der auch

definiert werden sollten.[2][3]

Einzelnachweise[Bearbeiten]

  1. Bjarne Stroustrup: The C++ Programming Language, 3, Addison-Wesley, 2000, ISBN 978-0201700732, S. 283-4.
  2. Proposing the Rule of Five
  3. Proposing the Rule of Five, v2

Literatur[Bearbeiten]

  • Stanley B. Lippman, Josèe Lajoie, Barbara E. Moo: C++ Primer. 4. Auflage. Addison-Wesley Professional, 2005. ISBN 978-0201721485