Operator wywołania funkcji: ()

Wywołanie funkcji jest rodzajem postfix-expression, utworzonego przez wyrażenie, które oblicza obiekt funkcji lub obiekt wywoływany, a następnie operator wywołania funkcji, (). Obiekt może zadeklarować operator () funkcję, która zapewnia semantyka wywołań funkcji dla obiektu.

Składnia

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

Uwagi

Argumenty operatora wywołania funkcji pochodzą z argument-expression-listrozdzielanej przecinkami listy wyrażeń. Wartości tych wyrażeń są przekazywane do funkcji jako argumenty. Lista-wyrażeń-argumentów może być pusta. Przed językiem C++17 kolejność obliczania wyrażenia funkcji i wyrażeń argumentów jest nieokreślona i może wystąpić w dowolnej kolejności. W języku C++17 lub nowszym wyrażenie funkcji jest obliczane przed wszelkimi wyrażeniami argumentów lub argumentami domyślnymi. Wyrażenia argumentów są obliczane w nieokreślonej sekwencji.

Funkcja postfix-expression oblicza metodę w celu wywołania. Może to mieć dowolną z kilku form:

  • identyfikator funkcji widoczny w bieżącym zakresie lub w zakresie dowolnych podanych argumentów funkcji,
  • wyrażenie, które oblicza funkcję, wskaźnik funkcji, obiekt z możliwością wywołania lub odwołanie do funkcji,
  • akcesor funkcji składowej, jawny lub dorozumiany,
  • wskaźnik wyłuszony do funkcji składowej.

Element postfix-expression może być przeciążonym identyfikatorem funkcji lub przeciążonym akcesorem funkcji składowej. Reguły rozpoznawania przeciążenia określają rzeczywistą funkcję do wywołania. Jeśli funkcja składowa jest wirtualna, funkcja do wywołania jest określana w czasie wykonywania.

Niektóre przykładowe deklaracje:

  • Funkcja zwracająca typ T. Przykładowa deklaracja to

    T func( int i );
    
  • Wskaźnik do funkcji zwracającej typ T. Przykładowa deklaracja to

    T (*func)( int i );
    
  • Odwołanie do funkcji zwracającej typ T. Przykładowa deklaracja to

    T (&func)(int i);
    
  • Wyłuszczenie funkcji wskaźnika do składowej zwraca typ T. Przykładowe wywołania funkcji to

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

Przykład

Poniższy przykład wywołuje funkcję strcat_s biblioteki standardowej z trzema argumentami:

// 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++

Wyniki wywołania funkcji

Wywołanie funkcji oblicza wartość rvalue, chyba że funkcja jest zadeklarowana jako typ odwołania. Funkcje z typami zwracanymi odwołaniami obliczają wartość lvalues. Te funkcje mogą być używane po lewej stronie instrukcji przypisania, jak pokazano poniżej:

// 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";
}

Powyższy kod definiuje klasę o nazwie Point, która zawiera prywatne obiekty danych reprezentujące współrzędne x i y . Te obiekty danych muszą być modyfikowane i pobierane ich wartości. Ten program jest tylko jednym z kilku projektów dla takiej klasy; GetX użycie funkcji i i SetXGetYSetY jest innym możliwym projektem.

Funkcje zwracające typy klas, wskaźniki do typów klas lub odwołania do typów klas mogą służyć jako lewy operand operatorów wyboru składowych. Poniższy kod jest legalny:

// 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 );
}

Funkcje mogą być wywoływane rekursywnie. Aby uzyskać więcej informacji na temat deklaracji funkcji, zobacz Funkcje. Powiązany materiał znajduje się w jednostkach tłumaczenia i łączeniu.

Zobacz też

Wyrażenia postfiksu
Wbudowane operatory, pierwszeństwo i kojarzenie języka C++
Wywołanie funkcji