Operátor volání funkce: ()

Volání funkce je druh postfix-expression, tvořený výrazem, který se vyhodnotí jako funkce nebo volatelný objekt následovaný operátorem volání funkce, (). Objekt může deklarovat operator () funkci, která poskytuje sémantiku volání pro objekt.

Syntaxe

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

Poznámky

Argumenty operátoru volání funkce pocházejí ze argument-expression-listseznamu výrazů oddělených čárkami. Hodnoty těchto výrazů se funkci předají jako argumenty. Seznam argument-expression-list může být prázdný. Před jazykem C++17 není zadáno pořadí vyhodnocení výrazu funkce a výrazy argumentů a může dojít v libovolném pořadí. V jazyce C++17 a novějším se výraz funkce vyhodnotí před libovolnými výrazy argumentů nebo výchozími argumenty. Výrazy argumentů se vyhodnocují v neurčité sekvenci.

Funkce postfix-expression , která se má volat, vyhodnotí. Může mít některou z několika forem:

  • identifikátor funkce, viditelný v aktuálním oboru nebo v rozsahu některého z zadaných argumentů funkce,
  • výraz, který se vyhodnotí jako funkce, ukazatel funkce, volatelný objekt nebo odkaz na ho,
  • přístupové objekty členské funkce, explicitní nebo implicitní,
  • ukazatel na členovou funkci.

Může postfix-expression to být identifikátor přetížené funkce nebo přetížené příslušenství členské funkce. Pravidla pro rozlišení přetížení určují skutečnou funkci, která se má volat. Pokud je členová funkce virtuální, funkce, která se má volat, se určí za běhu.

Příklady deklarací:

  • Návratový typ Tfunkce . Ukázková deklarace je

    T func( int i );
    
  • Ukazatel na funkci vracející typ T. Ukázková deklarace je

    T (*func)( int i );
    
  • Odkaz na funkci vracející typ T. Ukázková deklarace je

    T (&func)(int i);
    
  • Návratový typ Tfunkce ukazatele na člen . Ukázková volání funkcí jsou

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

Příklad

Následující příklad volá standardní funkci strcat_s knihovny se třemi argumenty:

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

Výsledky volání funkce

Volání funkce se vyhodnotí jako rvalue, pokud není funkce deklarována jako typ odkazu. Funkce s návratovými typy odkazů se vyhodnocují jako lvalues. Tyto funkce se dají použít na levé straně příkazu přiřazení, jak je vidět tady:

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

Předchozí kód definuje třídu s názvem Point, která obsahuje privátní datové objekty, které představují souřadnice x a y . Tyto datové objekty musejí být upraveny a jejich hodnoty načteny. Tento program je pouze jednou z několika možností pro takovou třídu. Použití funkcí GetX a SetX nebo GetY a SetY představuje další možnost.

Funkce vracející typy tříd, ukazatele na typy tříd nebo odkazy na typy tříd lze použít jako levý operand pro operátory výběru členů. Následující kód je právní:

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

Funkce lze volat rekurzivně. Další informace o deklaracích funkcí najdete v tématu Funkce. Související materiál je v jednotkách překladu a propojení.

Viz také

Výrazy přípony
Integrované operátory jazyka C++, priorita a asociativita
Volání funkce