Funktionsaufruf ()

Der Funktionsaufruf-Operator ruft eine Funktion mit einer Argumentenliste auf. Die aufzurufende Funktion steht dabei links von runden Klammern () und die Argunentenliste steht innerhalb der Klammern.

#include <stdio.h> int get_addition(int a, int b){ return a+b; } int main(){ int result = get_addition(1, 1); printf("%d\n", result); return 0; }

2

Siehe auch Deklaration einer Funktion

Details

Der Funktionsaufruf-Operator erwartet grundsätzlich links einen lvalue: Eine Referenz auf eine definierte Funktion. Innerhalb der runden Klammern () wird eine Argunentenliste erwartet (die leer sein kann). Der Operator wird von links nach rechts abgearbeitet. Der Rückgabewert entspricht dem Rückgabewert der Funktion und kann ein lvalue oder rvalue sein.

Normalerweise befindet sich auf der linken Seite des Funktionsaufruf-Operators ein Symbol, zu welchem eine Funktion deklariert und definiert wurde. Der links erwartete Operand kann jedoch auch ein Funktions-Pointer sein, welcher durch den Funktionsaufruf-Operator automatisch dereferenziert wird. So ist es beispielsweise möglich, einen Funktions-Pointer aus einem Array oder gar aus dem Rückgabewert einer anderen Funktion zu erhalten:

#include <stdio.h> int get_addition(int a, int b){return a+b;} int get_subtraction(int a, int b){return a-b;} int (*getFunc(char op))(int a, int b) { switch(op){ case '+': return &get_addition; break; case '-': return &get_subtraction; break; } return NULL; } int main(){ int result; result = getFunc('+')(6, 4); printf("%d\n", result); result = getFunc('-')(6, 4); printf("%d\n", result); return 0; }

10 2

Solche Konstrukte mit Funktions-Pointern sind jedoch eher selten und für den ungeübten Programmierer sehr umständlich zu programmieren. Genaueres kann bei den Funktions-Pointern nachgelesen werden.

Die Argumentenliste kann entweder leer sein, oder eine durch Komma , getrennte Liste von Argumenten, welche an die Funktion übergeben werden sollen. Die Anzahl Argumente muss dabei der Deklaration der aufzurufenden Funktion entsprechen. Wenn es sich bei der Funktion um eine variadische Funktion handelt, können beliebig viele Argumente übergeben werden. Die Übergabe von Argumenten bedeutet, dass im Bereich der Funktion die Parameter mit den Argumenten initialisiert werden. Auf welche Art die Argumente übergeben werden können, kann bei den Argumenten und Parametern nachgelesen werden.

Überladen des Operators

Der Funktionsaufruf-Operator hat grundsätzlich die semantische Bedeutung des Aufrufes einer intuitiven Eigen-Funktionalität des Objektes. Damit ist gemeint, dass ein Objekt rein durch die Namensgebung und die dahinterliegende Strukturierung und Ausprogrammierung eine gewisse Funktionalität nahelegt. Beispielsweise kann ein Programmierer Converter-, Counter-, Creator-, Deletor-, ... und ähnliche Klassen definieren, welche allesamt in sich eine gewisse Funktionalität vermuten lassen. Solche Klassen werden oftmals als Ableitung einer Basisklasse deklariert, wobei auf die Eigen-Funktionalität eines entsprechenden Objektes mittels des Funktinosaufruf-Operators zugegriffen werden kann. Dem Programmierer steht frei, den Funktionsoperator jedoch auch für andere, nicht sofort ersichtliche Funktionalitäten zu verwenden. Es sei jedoch darauf hingewiesen, dass der Funktionsaufruf-Operator im Allgemeinen nur selten überladen wird.

Die Prototypen für das Überladen des Funktionsaufruf-Operators sind die folgenden (Einschränkungen und Erläuterungen siehe Überladen von Operatoren):

Type operator ()(Parameterlist); Type operator ()(Parameterlist) const;

inside class

Man beachte, dass der Funktionsaufruf-Operator nur innerhalb einer Klasse deklariert werden kann. Die Parameterliste kann wie bei jeder anderen Funktion leer sein oder durch Komma , getrennte Parameterangaben enthalten. Im Gegensatz zu allen anderen Operator-Überladungen können beliebig viele Parameter angegeben werden. Mittels der Auslassungspunkte ... können gar variadische Funktionsaufruf-Überladungen deklariert werden.

Im folgenden Beispiel wird eine Converter-Klasse präsentiert, welche Kleinbuchstaben in Grossbuchstaben verwandelt.

#include <cstdio> #include <cstring> class UpperCaseConverter{ public: UpperCaseConverter(){} void operator ()(char* output, const char* input) const { int len = strlen(input); for(int i=0; i<len; i++){ output[i] = input[i]; if(input[i]>='a' && input[i]<='z'){output[i] -= 32;} } output[len] = '\0'; } }; int main(){ UpperCaseConverter converter; const char* original = "Hello World!"; char newstring[100]; converter(newstring, original); printf("%s\n", newstring); return 0; }

HELLO WORLD!