Udostępnij za pośrednictwem


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 SetX GetY SetY 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