C++ Kurs

Default-Parameter

Die Themen:

Syntax

HinweisDie nachfolgenden Ausführungen beziehen sich sowohl auf Memberfunktionen wie auch auf Funktionen. Wenn im Folgenden von Funktionen gesprochen wird, so sind damit stets auch Memberfunktionen gemeint.

C++ erlaubt es, Funktionsparameter mit Defaultwerten zu belegen. Und Parameter, für die ein Defaultwert definiert ist, können beim Aufruf einer Funktion weggelassen werden. In diesem Fall erhält dann der Parameter den Defaultwert.

Um einen Parameter mit einem Defaultwert zu versehen, wird nach dem Parameternamen der Zuweisungsoperator angegeben, gefolgt vom Defaultwert. Im Beispiel wird dem letzte Parameter symbol z.B. das Zeichen '#' als Defaultwert zugewiesen. Zu der dann möglichen Aufrufsyntax der Funktion kommen wir gleich noch.

PgmHeader
void DrawRect(short xPos, short yPos, short width, short height,
              char symbol = '#')
{
   ...
}

Die Anzahl der Default-Parameter einer Funktion ist nicht begrenzt, jedoch ist dabei Folgendes zu beachten: erhält ein Parameter einen Defaultwert, so müssen alle rechts davon stehenden Parameter ebenfalls einen Defaultwert besitzen. Dies ist bereits bei der Spezifikation der Funktion zu beachten. Als Defaultwerte sind nur Literale oder Konstanten zugelassen und selbstverständlich muss der Datentyp des Defaultwertes mit dem Datentyp des Parameters übereinstimmen. Die erste nachfolgende Funktionsdefinition ist syntaktisch in Ordnung, da die beiden Parameter height und symbol jeweils einen Defaultwert erhalten. Die zweite Funktionsdefinition hingegen ist fehlerhaft. Der Parameter height erhält hier zwar einen Defaultwert, aber der rechts davon befindliche Parameter symbol nicht. Und dies ist unzulässig.

PgmHeader
// Das ist in Ordnung
void DrawRect(short xPos, short yPos, short width, short height = 1, char symbol = '#')
{
   ...
}
// Aber dies erzeugt einen Fehler
void DrawRect(short xPos, short yPos, short width, short height = 1, char symbol)
{
   ...
}

Definition der Default-Parameter

Die Angabe der Default-Parameter kann auf zweierlei Arten erfolgen:

  1. Bei der Deklaration der Funktion oder
  2. bei der Definition der Funktion

Jedoch dürfen die Default-Parameter nur an einer Stelle angeben, d.h. entweder bei der Deklaration oder bei der Definition.

PgmHeader
// Default-Parameter bei der Deklaration
// Deklaration

void DrawRect(short xPos, short yPos, short width, short height = 1, char symbol = '#');

// Definition
void DrawRect(short xPos, short yPos, short width, short weight, char symbol)
{
   ...
}

// Default-Parameter bei der Definition
// Deklaration

void DrawRect(short xPos, short yPos, short width, short height, char symbol);
// Definition
void DrawRect(short xPos, short yPos, short width, short height = 1, char symbol = '#')
{
   ...
}

Allerdings sollten die Default-Parameter nach Möglichkeit stets bei der Deklaration angegeben werden. In der Regel werden die Funktionsdeklarationen bei größeren Projekten in einer Header-Datei zusammengefasst, die dann vom entsprechenden Modul eingebunden wird das die Funktionen aufruft. Und nur wenn die Default-Parameter in dieser Header-Datei stehen, sind sie auch in den Modulen bekannt.

Aufruf der Funktion

Sehen wir uns nun den Aufruf einer Funktion mit fünf Parametern an, deren letzte zwei Parameter einen Defaultwert besitzen. Der erste Aufruf übergibt an die Funktion nur 3 Argumente. Die beiden beim Aufruf fehlenden Argumente für height und symbol werden dann mit den Defaultwerten belegt. Der zweite Aufruf übergibt zusätzlich noch die Höhe height was dazu führt, dass nur der Parameter symbol mit seinem Defaultwert belegt wird.

PgmHeader
// Funktionsdefinition
void DrawRect(short xPos, short yPos, short width, short height = 1, char symbol = '#')
{
   ...
}

// Erlaubte Aufrufe
DrawRect(10,10,100);      // entspricht dem Aufruf DrawRect(10,10,100,1,'#')
DrawRect(10,10,100,100);  // entspricht dem Aufruf: DrawRect(10,10,100,100,'#')

// Aber dies ist nicht erlaubt!
// DrawRect(10,10,100,,'*');

Beim Aufruf von Funktionen mit Defaultparametern ist allerdings beachten, dass wenn beim Aufruf einer Funktion für einen der Parameter mit einem Defaultwert explizit ein Wert übergeben wird, so müssen für alle links davon stehenden Parameter ebenfalls Werte übergeben werden. Beim letzten Aufruf im Beispiel oben wird für den letzten Parameter explizit ein Wert vorgegeben und damit müssen für alle links davon stehenden Parameter ebenfalls Werte angegeben werden.

Funktionserweiterung durch Default-Parameter

Zum Abschluss dieses Kapitels noch ein kleiner Tipp.

Default-Parameter eignen sich auch hervorragend dazu, die Funktionalität einer bereits bestehenden Funktion zu erweitern, ohne dass bereits bestehende Funktionsaufrufe angefasst werden müssen. Sehen wir uns einmal dazu das nachfolgende Beispiel an. Das Beispiel enthält eine Funktion SortIt(...), die ein char-Feld z.B. in aufsteigender Reihenfolge sortieren soll.

PgmHeader
// Funktionsdeklaration
void SortIt(char* array);

// main() Funktion
int main()
{
   ...
   SortIt(myArray);
   ...
}

// Funktionsdefinition
void SortIt(char* array)
{
   ... //aufsteigend sortieren
}

Im weiteren Verlaufe der Programmentwicklung stellt sich nun die Anforderung, dass das char-Feld auch wahlweise in fallender Reihenfolge sortiert werden soll. Hierzu wird der Funktion ein zusätzlicher Parameter übergeben, der die Sortierrichtung festlegt. Normalerweise wären nun auch alle bisherigen Funktionsaufrufe entsprechend anzupassen.

Mit Hilfe eines Default-Parameters ist es jetzt jedoch möglich, lediglich die Funktion an die neue Anforderung anzupassen und bereits bestehende Funktionsaufrufe unverändert zu lassen.

Dazu wird der für die Sortierrichtung zusätzliche Parameter mit einem Defaultwert versehen, der die bisherige aufsteigende Sortierrichtung festlegt. Wie zwischenzeitlich ja bekannt, können beim Funktionsaufruf Parameter mit einem Defaultwert weggelassen werden. D.h. wird die Funktion wie bisher mit nur einem Argument aufgerufen, wird das char-Feld aufsteigend sortiert. Soll das Feld dagegen fallend sortiert werden, so ist beim Aufruf der Funktion ein vom Defaultwert abweichender Wert anzugeben.

PgmHeader
// Funktionsdeklaration
void SortIt(char* array, bool dir = true);

// main() Funktion
int main()
{
   ...
   SortIt(myArray);         // aufsteigend sortieren
   ...
   SortIt(myArray, false);  // fallend sortieren
}

// Funktionsdefinition
void SortIt(char* array, bool dir)
{
   if (dir)
      ... // aufsteigend sortieren
   else
      ... // fallend sortieren
}

Beispiel und ÜbungUnd hier geht's zum Beispiel und zur Übung.