Funktionsaufrufoperator: ()

Ein Funktionsaufruf ist eine Art von postfix-expression, der durch einen Ausdruck gebildet wird, der zu einer Funktion oder einem aufrufbaren Objekt ausgewertet wird, gefolgt vom Funktionsaufrufoperator (). Ein Objekt kann eine operator ()-Funktion deklarieren, die Funktionsaufrufsemantik für das Objekt bereitstellt.

Syntax

postfix-expression:
postfix-expression ( argument-expression-list opt )

Hinweise

Die Argumente für den Funktionsaufrufoperator stammen aus einer argument-expression-list, einer durch Trennzeichen getrennten Liste von Ausdrücken. Die Werte dieser Ausdrücke werden als Argumente an die Funktion übergeben. Die Liste argument-expression-list kann leer sein. Vor C++17 ist die Reihenfolge, in der der Funktionsausdruck und die Argumentausdrücke ausgewertet werden, nicht festgelegt, und die Auswertung kann in beliebiger Reihenfolge erfolgen. In C++17 und höher wird der Funktionsausdruck vor ggf. vorhandenen Argumentausdrücken oder Standardargumenten ausgewertet. Die Argumentausdrücke werden in unbestimmter Reihenfolge ausgewertet.

postfix-expression wird zu der Funktion ausgewertet, die aufgerufen werden soll. Der Ausdruck kann mehrere Formen annehmen:

  • ein Funktionsbezeichner, der im aktuellen Bereich oder im Bereich eines der bereitgestellten Funktionsargumente sichtbar ist,
  • ein Ausdruck, der zu einer Funktion, einem Funktionszeiger, einem aufrufbaren Objekt oder einem Verweis auf eine Funktion ausgewertet wird,
  • eine Zugriffsmethode für eine Memberfunktion, entweder explizit oder implizit,
  • ein abgeleiteter Zeiger auf eine Memberfunktion.

postfix-expression kann ein überladener Funktionsbezeichner oder eine überladene Zugriffsmethode für eine Memberfunktion sein. Die Regeln für die Überladungsauflösung bestimmen die Funktion, die tatsächlich aufgerufen werden soll. Wenn die Memberfunktion virtuell ist, wird die aufzurufende Funktion zur Laufzeit bestimmt.

Einige Beispieldeklarationen:

  • Funktion, die den Typ T zurückgibt. Eine Beispieldeklaration ist

    T func( int i );
    
  • Zeiger auf eine Funktion, die den Typ T zurückgibt. Eine Beispieldeklaration ist

    T (*func)( int i );
    
  • Verweis auf eine Funktion, die den Typ T zurückgibt. Eine Beispieldeklaration ist

    T (&func)(int i);
    
  • Zeiger auf eine Memberfunktion dereferenziert die Rückgabe des Typs T. Beispiele für Funktionsaufrufe sind

    (pObject->*pmf)();
    (Object.*pmf)();
    

Beispiel

Im folgenden Beispiel wird die Standardbibliotheksfunktion strcat_s mit drei Argumenten aufgerufen:

// expre_Function_Call_Operator.cpp
// compile with: /EHsc

#include <iostream>
#include <string>

// C++ Standard Library name space
using namespace std;

int main()
{
    enum
    {
        sizeOfBuffer = 20
    };

    char s1[ sizeOfBuffer ] = "Welcome to ";
    char s2[ ] = "C++";

    strcat_s( s1, sizeOfBuffer, s2 );

    cout << s1 << endl;
}
Welcome to C++

Ergebnisse des Funktionsaufrufs

Ein Funktionsaufruf wird zu einem rvalue-Wert ausgewertet, sofern die Funktion nicht als Verweistyp deklariert ist. Funktionen mit Verweistypen als Rückgabetyp werden zu lvalue-Werten ausgewertet. Diese Funktionen können auf der linken Seite einer Zuordnungsanweisung verwendet werden, wie hier dargestellt:

// expre_Function_Call_Results.cpp
// compile with: /EHsc
#include <iostream>
class Point
{
public:
    // Define "accessor" functions as
    // reference types.
    unsigned& x() { return _x; }
    unsigned& y() { return _y; }
private:
    unsigned _x;
    unsigned _y;
};

using namespace std;
int main()
{
    Point ThePoint;

    ThePoint.x() = 7;           // Use x() as an l-value.
    unsigned y = ThePoint.y();  // Use y() as an r-value.

    // Use x() and y() as r-values.
    cout << "x = " << ThePoint.x() << "\n"
         << "y = " << ThePoint.y() << "\n";
}

Dieser vorstehehende Code definiert eine Klasse namens Point. Sie enthält private Datenobjekte, die die Koordinaten x und y darstellen. Diese Datenobjekte müssen geändert und ihre Werte abgerufen werden. Dieses Programm ist nur einer von mehreren Entwürfen für eine solche Klasse. Eine Verwendung der Funktionen GetX und SetX oder GetY und SetY ist ein anderer möglicher Entwurf.

Funktionen, die Klassentypen, Zeiger auf Klassentypen oder Verweise auf Klassentypen zurückgeben, können als linker Operand für Memberauswahloperatoren verwendet werden. Der folgende Code ist zulässig:

// expre_Function_Results2.cpp
class A {
public:
   A() {}
   A(int i) {}
   int SetA( int i ) {
      return (I = i);
   }

   int GetA() {
      return I;
   }

private:
   int I;
};

A func1() {
   A a = 0;
   return a;
}

A* func2() {
   A *a = new A();
   return a;
}

A& func3() {
   A *a = new A();
   A &b = *a;
   return b;
}

int main() {
   int iResult = func1().GetA();
   func2()->SetA( 3 );
   func3().SetA( 7 );
}

Funktionen können rekursiv aufgerufen werden. Weitere Informationen zu Funktionsdeklarationen finden Sie unter Funktionen. Verwandtes Material finden Sie in Übersetzungseinheiten und Verknüpfungen.

Siehe auch

Postfixausdrücke
Integrierte C++-Operatoren, Rangfolge und Assoziativität
Funktionsaufruf