C++ Tutorial

Default-Parameter

Definition des Default-Parameters

Werden für Parameter einer Funktion häufig die gleichen Werte übergeben, können für diese Parameter Defaultwerte vorgegeben werden. Argumente, für die ein Defaultwert definiert ist, können beim Aufruf der Funktion entfallen. In diesem Fall enthält 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 das Zeichen '#' als Defaultwert zugewiesen.

1: void DrawRect(short xPos, short yPos,
2:               short width, short height,
3:               char symbol = '#')
4: {...}

Besitzt ein Parameter einen Defaultwert, müssen alle danach folgenden Parameter ebenfalls einen Defaultwert besitzen. Dies ist bei der Spezifikation der Funktion zu beachten. Als Defaultwerte sind nur Literale oder Konstanten zugelassen und der Datentyp des Defaultwertes muss mit dem Datentyp des Parameters übereinstimmen oder sich in diesen konvertieren lassen. Die erste Funktionsdefinition im nachfolgenden Beispiel 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, der nachfolgende Parameter symbol dagegen nicht.

1: // Das ist in Ordnung
2: void DrawRect1(short xPos, short yPos, short width,
3:                short height = 1, char symbol = '#')
4: {...}
5: // Aber dies erzeugt einen Fehler
6: void DrawRect2(short xPos, short yPos, short width,
7:                short height = 1, char symbol)
8: {...}

Funktionsdeklaration/-definition

Die Definition von Default-Parametern kann auf zweierlei Arten erfolgen:

  • Bei der Deklaration der Funktion oder
  • bei der Definition der Funktion

Jedoch dürfen die Defaultwerte nur an einer Stelle angegeben werden, entweder bei der Deklaration oder bei der Definition.

1: // Deklarationen
2: // Default-Parameter bei der Deklaration
3: void DrawRect1(short xPos, short yPos, short width,
4:                short height = 1, char symbol = '#');
5: // Default-Parameter ist bei der Definition
6: void DrawRect2(short xPos, short yPos, short width,
7:                short weight, char symbol);
8:
9: // Definitionen
10: // Default-Parameter ist bei der Deklaration
11: void DrawRect1(short xPos, short yPos, short width,
12:                short height, char symbol)
13: {...}
14: // Default-Parameter bei der Definition
15: void DrawRect2(short xPos, short yPos, short width,
16:                short height = 1, char symbol = '#')
17: {...}

Erfolgt die Definition der Funktion in einem Modul, spielt es keine Rolle, ob die Default-Parameter bei der Deklaration oder Definition der Funktion angegeben werden.

Wird die Funktion nicht in einem Modul definiert, sollten die Default-Parameter nach Möglichkeit bei der Deklaration angegeben werden. In der Regel werden Funktionsdeklarationen bei größeren Projekten in einer Header-Datei zusammengefasst, die von den Quellcode-Dateien eingebunden werden, welche die Funktion aufrufen. Und nur wenn die Default-Parameter in dieser Header-Datei angegeben sind, sind sie in den Quellcode-Dateien bekannt.

Aufruf der Funktion

Beim Aufruf einer Funktion mit Default-Parametern ist beachten, wenn für einen der Default-Parameter ein Argument übergeben wird, sind für alle davor stehenden Parameter ebenfalls Argumente zu übergeben.

Sehen wir uns einige Aufrufe einer Funktion mit fünf Parametern an, deren letzte zwei Parameter Defaultwerte besitzen.

1: // Funktionsdefinition
2: void DrawRect(short xPos, short yPos, short width,
3:               short height = 1, char symbol = '#')
4: {...}
5:
6: // Erlaubte Aufrufe
7: // entspricht dem Aufruf DrawRect(10,10,100,1,'#')
8: DrawRect(10,10,100);
9: // entspricht dem Aufruf: DrawRect(10,10,100,100,'#')
10: DrawRect(10,10,100,100);
11: // Aber dies ist nicht erlaubt!
12: // DrawRect(10,10,100,,'*');

Der erste Aufruf übergibt an die Funktion 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 die Höhe height, was dazu führt, dass nur der Parameter symbol mit seinem Defaultwert belegt wird. Beim letzten Aufruf im Beispiel oben wird für den letzten Parameter ein Argument übergeben und damit sind für alle links davor stehenden Parameter ebenfalls Argumente zu übergeben.

Funktionserweiterung durch Default-Parameter

Default-Parameter eignen sich gut dazu, die Funktionalität einer bestehenden Funktion zu erweitern, ohne dass existierende Funktionsaufrufe angepasst werden müssen. Das nachfolgende Beispiel enthält eine Funktion SortIt(), die ein char-Feld z.B. in aufsteigender Reihenfolge sortieren soll.

1: // Funktionsdeklaration
2: void SortIt(char* array);
3:
4: // main() Funktion
5: int main()
6: {
7:    ...
8:    SortIt(myArray);
9: }
10:
11: // Funktionsdefinition
12: void SortIt(char* array)
13: {
14:    ... //aufsteigend sortieren
15: }

Im weiteren Verlaufe der Entwicklung ergibt sich die Anforderung, das char-Feld ebenfalls in fallender Reihenfolge zu sortieren. Hierzu wird die Funktion um einen zusätzlichen Parameter erweitert, der die Sortierrichtung festlegt. Normalerweise wären nun alle bisherigen Funktionsaufrufe anzupassen.

Mithilfe eines Default-Parameters es möglich, lediglich die Funktion an die neue Anforderung anzupassen und 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 bekannt, können beim Funktionsaufruf Argumente für 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, ist beim Aufruf der Funktion ein vom Defaultwert abweichender Wert anzugeben.

1: // Funktionsdeklaration
2: void SortIt(char* array, bool dir = true);
3:
4: // main() Funktion
5: int main()
6: {
7:     ...
8:     SortIt(myArray); // aufsteigend sortieren
9:     ...
10:    SortIt(myArray, false); // fallend sortieren
11: }
12:
13: // Funktionsdefinition
14: void SortIt(char* array, bool dir)
15: {
16:    if (dir)
17:       ... // aufsteigend sortieren
18:    else
19:       ... // fallend sortieren
20: }

Copyright 2024 © Wolfgang Schröder
E-Mail mit Fragen oder Kommentaren zu dieser Website an: info@cpp-tutor.de
Impressum & Datenschutz