Default Parameter

Wenn eine Funktion häufig ein bestimmtes Verhalten an den Tag legen soll, welches allerdings von seinen Parametern abhängig ist, so empfiehlt sich der Einsatz von sog. Default-Parametern. Ein einfaches Beispiel wäre es, eine Begrüßungsnachricht zum Start des Programmes an zu geben:

// Deklarationen
void say_hello(const std::string& = "Hallo, werter Benutzer\n");
void say_hello(const char* ); // darf kein Default-Parameter haben, da sonst nicht mit std::string zu unterscheiden
 
// Eine Definition
double root(double radicant, int root_exponent = 2) {
	// Implementierung
}
 
say_hello(); // wenn kein Parameter angegeben, benutze "Hallo, werter Benutzer\n"
say_hello("Guten Tag, Administrator\n"); // Alternative Nachricht der Funktion übergeben
 
std::cout << root(9.00) << std::endl; // Gibt die Quadratwurzel von 9 aus
std::cout << root(9.00, 4) << std::endl; // Gibt die 4. Wurzel von 9 aus

Geben wir also explizit keinen Parameter an, so wird der Default-Parameter implizit für den Aufruf der Funktion benutzt. Geben wir jedoch einen Parameter an, so überschreibt dieser den Defaultwert im Funktionskopf. Das kann in vielen Fällen sehr praktisch werden, besonders, wenn eine Funktion sehr viele Parameter haben sollte.

Reihenfolge der Funktionsparameter

Das Wurzel-Beispiel beinhaltet außerdem noch einen anderen, wichtigen Aspekt: die Parameterreihenfolge. Sobald man sich entschieden hat, einem Parameter einen Standardwert zu geben, so müssen die Nachfolger ebenfalls Default-Werte besitzen.

// Code wird nicht kompilieren
double root(int root_exponent = 2, double radikant) {
	// Implementierung
}
 
root(5.00); // kompiliert nicht, der Compiler würde versuchen, 5.00 als root_exponent zu benutzen

Der Compiler kann an dieser Stelle nicht entscheiden, ob der eine Parameter nun den Defaultparameter überschreiben oder als Radikant benutzt werden soll, demnach verweigert er hier die Arbeit ganz. Es ist daher wichtig, sich die Reihenfolge der Parameter schon vorher gut zu durchdenken und die Entscheidung zu begründen. Eine allgemeine Faustregel besagt, dass die Parameter in der Reihenfolge ihrer Wichtigkeit angegeben werden sollten. Da Default-Parameter immer eine mindere Rolle spielen, stehen sie, sofern andere Parameter angegeben werden, ganz hinten in der Funktionsdeklaration, während wichtigere, wie etwa der Radikant, am Anfang angegeben werden sollten.