Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Operador de llamada de función:
Una llamada de función es un tipo de postfix-expression, formado por una expresión que se evalúa como una función o un objeto invocable seguido del operador function-call, (). 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-listopt)
Observaciones
Los argumentos del operador function-call proceden de una argument-expression-listlista separada por comas de expresiones. Los valores de estas expresiones se pasan a la función como argumentos. La lista argument-expression-list puede estar vacía. Antes de C++17, el orden de evaluación de la expresión de función y las expresiones de argumento no se especifican y pueden producirse en cualquier orden. En C++17 y versiones posteriores, la expresión de función se evalúa antes de cualquier expresión de argumento o argumentos predeterminados. Las expresiones de argumento se evalúan en una secuencia indeterminada.
se postfix-expression evalúa como la función a la que se va a llamar. Puede tomar cualquiera de las formas siguientes:
- un identificador de función, visible en el ámbito actual o en el ámbito de cualquiera de los argumentos de función proporcionados,
- expresión que se evalúa como una función, un puntero de función, un objeto invocable o una referencia a una,
- un descriptor de acceso de función miembro, explícito o implícito,
- 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 sobrecarga 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:
Función que devuelve el tipo
T. Una declaración de ejemplo esT func( int i );Puntero a una función que devuelve el tipo
T. Una declaración de ejemplo esT (*func)( int i );Referencia a una función que devuelve el tipo
T. Una declaración de ejemplo esT (&func)(int i);Desreferencia de función de puntero a miembro que devuelve el tipo
T. Las llamadas de función de ejemplo son(pObject->*pmf)(); (Object.*pmf)();
Ejemplo
En el ejemplo siguiente se llama a la función strcat_s de biblioteca estándar 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 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 denominada Point, que contiene objetos de datos privados que representan coordenadas x e y . Estos objetos de datos se deben modificar y sus valores recuperados. Este programa es solo uno de varios diseños para tal clase; el uso de las GetX funciones y y SetXGetYSetY 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 usar como operando izquierdo a 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 postfijo
Operadores integrados de C++, precedencia y asociatividad
Llamada de función