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 Elementfunktionen 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 Funktionen gemacht, so bedeutet das, dass die compilergenerierte Version den Anforderungen der Klasse nicht genügt. Daraus lässt sich schließen, dass das wahrscheinlich auch bei den anderen beiden Funktionen der Fall ist.

Der Grund ist, dass compilergenerierte Funktionen 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) und diese nur über Zeiger referenziert. 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]

Seit C++11 ist es zudem möglich, das Erzeugen der compilergenerierten Version explizit zu erzwingen oder explizit zu unterdrücken:

class Example
{
    Example(const Example&) = default;  // erzwinge compilergenerierte Version
    void operator=(const Example&) = delete; // verhindere compilergenerierte Version
};

Literatur[Bearbeiten | Quelltext bearbeiten]

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

Einzelnachweise[Bearbeiten | Quelltext bearbeiten]

  1. Bjarne Stroustrup: The C++ Programming Language. 3. Auflage. Addison-Wesley, 2000, ISBN 0-201-70073-5, S. 283–284.
  2. Proposing the Rule of Five
  3. Proposing the Rule of Five, v2