Operador de llamada de función: ()

Una llamada de función es un tipo de , formado por una expresión que se evalúa como una función o un objeto al que se puede llamar seguido del operador de llamada a postfix-expression función, () . Un objeto puede declarar una operator () función, que proporciona semántica de llamada de función para el objeto .

Sintaxis

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

Comentarios

Los argumentos del operador function-call proceden de argument-expression-list , una lista separada por comas de expresiones. Los valores de estas expresiones se pasan a la función como argumentos. Argument-expression-list puede estar vacío. Antes de C++ 17, el orden de evaluación de la expresión de función y las expresiones de argumento no se especifica y puede producirse en cualquier orden. En C++17 y versiones posteriores, la expresión de función se evalúa antes que cualquier expresión de argumento o argumento predeterminado. Las expresiones de argumento se evalúan en una secuencia indeterminada.

se postfix-expression evalúa como la función a la que se llamará. Puede tener cualquiera de las siguientes formas:

  • un identificador de función, visible en el ámbito actual o en el ámbito de cualquiera de los argumentos de función proporcionados,
  • una expresión que se evalúa como una función, un puntero de función, un objeto al que se puede llamar o una referencia a una,
  • un accessor de función miembro, ya sea explícito o implícito,
  • puntero desreferenciado a una función miembro.

puede postfix-expression ser un identificador de función sobrecargado o un accessor de función miembro sobrecargado. Las reglas para la resolución de sobrecarga determinan la función real a la que se debe llamar. Si la función miembro es virtual, la función a la que se va a llamar se determina en tiempo de ejecución.

Algunas declaraciones de ejemplo:

  • Una función que devuelve el tipo T. Una declaración de ejemplo es

    T func( int i );
    
  • Un puntero a una función que devuelve el tipo T. Una declaración de ejemplo es

    T (*func)( int i );
    
  • Una referencia a una función que devuelve el tipo T. Una declaración de ejemplo es

    T (&func)(int i);
    
  • Una desreferencia de función de puntero a miembro que devuelve el tipo T. Estos son algunos ejemplos de llamadas de función:

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

Ejemplo

En el ejemplo siguiente se llama a la función de biblioteca estándar strcat_s con tres argumentos:

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

Resultados de la llamada de función

Una llamada de función se evalúa como un valor r, a menos que la función se declare como un tipo de referencia. Las funciones con tipos de valor devuelto de referencia se evalúan como lvalues. Estas funciones se pueden usar en el lado izquierdo de una instrucción de asignación, como se muestra aquí:

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

El código anterior define una clase denominada Point , que contiene objetos de datos privados que representan coordenadas x e y. Estos objetos de datos se deben modificar y sus valores se deben recuperar. Este programa es solo uno de varios diseños para esa clase; el uso de las funciones GetX y SetX o GetY y SetY es otro diseño posible.

Las funciones que devuelven tipos de clase, punteros a tipos de clase o referencias a tipos de clase se pueden utilizar como operando izquierdo para operadores de selección de miembros. El código siguiente es legal:

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

Las funciones se pueden llamar de forma recursiva. Para obtener más información sobre las declaraciones de función, vea Functions. El material relacionado está en unidades de traducción y vinculación.

Consulte también

Expresiones de postfijo
Operadores integrados de C++, precedencia y asociatividad
Llamada a función