Operador de llamada de función: ()

Una llamada de función es un tipo de postfix-expression formada 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 de función, (). Un objeto puede declarar una función operator (), lo 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 de llamada de función proceden de argument-expression-list, una lista de expresiones separadas por comas. Los valores de estas expresiones se pasan a la función como argumentos. El elemento 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 especificaba y podía ejecutarse 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.

postfix-expression se evalúa como la función a la que se va a llamar. Puede tomar cualquiera de entre varias 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 uno,
  • un descriptor de acceso de función miembro, ya sea explícito o implícito,
  • un puntero desreferenciado a una función miembro.

postfix-expression puede ser un identificador de función sobrecargado o un descriptor de acceso de función miembro sobrecargado. Las reglas para la resolución de sobrecargas determinan la función real a la que se va a 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 rvalue a menos que la función se declare como un tipo de referencia. Las funciones con tipos devueltos 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 de nombre 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 declaraciones de función, vea Funciones. Hay material relacionado en Unidades de traducción y vinculación.

Consulte también

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