Functions
Las funciones son entidades de C++ que asocian una secuencia de statements (un function body ) con un name y una lista de cero o más function parameters .
// nombre de la función: "isodd" // la lista de parámetros tiene un parámetro, con nombre "n" y tipo int // el tipo de retorno es bool bool isodd(int n) { // el cuerpo de la función comienza return n % 2; } // el cuerpo de la función termina
Cuando una función es invocada, por ejemplo en una expresión de llamada a función , los parámetros se inicializan desde los argumentos (ya sea proporcionados en el lugar de la llamada o por defecto ) y las sentencias en el cuerpo de la función se ejecutan. Si la lista de parámetros termina con ... , se pueden suministrar argumentos adicionales a la función, dicha función se denomina función variádica .
int main() { for (int arg : {-3, -2, -1, 0, 1, 2, 3}) std::cout << isodd(arg) << ' '; // isodd llamado 7 veces, cada // vez n es inicializado por copia desde arg }
Unqualified los nombres de función en expresiones de llamada a función se buscan con un conjunto adicional de reglas llamado "argument-dependent lookup" (ADL) .
Una función puede terminar retornando o lanzando una excepción .
|
Una función puede ser una coroutine , en cuyo caso puede suspender la ejecución para reanudarse más tarde. |
(since C++20) |
Una declaración de función puede aparecer en cualquier ámbito, pero una definición de función solo puede aparecer en el ámbito de espacio de nombres o, para funciones miembro y friend , en el ámbito de clase. Una función que se declara en el cuerpo de una clase sin el especificador friend es una función miembro de clase. Dichas funciones tienen muchas propiedades adicionales, consulte member functions para más detalles.
Las funciones no son objetos: no existen arreglos de funciones y las funciones no pueden pasarse por valor o devolverse desde otras funciones. Los punteros y referencias a funciones (excepto para la función main y la mayoría de las funciones de la biblioteca estándar (desde C++20) ) están permitidos, y pueden usarse donde estas funciones mismas no pueden. Por lo tanto, decimos que estas funciones son "direccionables".
Cada función tiene un tipo, que consiste en el tipo de retorno de la función, los tipos de todos los parámetros (después de las transformaciones de array-a-pointer y function-to-pointer, ver
lista de parámetros
)
, si la función es
noexcept
o no
(desde C++17)
, y, para funciones miembro no estáticas, calificación cv
y calificación ref
(desde C++11)
. Los tipos de función también tienen
vinculación de lenguaje
. No existen tipos de función calificados cv (no confundir con los tipos de
funciones calificadas cv
como
int
f
(
)
const
;
o funciones que retornan
tipos calificados cv
, como
std::
string
const
f
(
)
;
). Cualquier calificador cv es ignorado si se añade a un alias para un tipo de función.
Múltiples funciones en el mismo ámbito pueden tener el mismo nombre, siempre que sus listas de parámetros y, para funciones miembro no estáticas, las calificaciones cv /ref (since C++11) sean diferentes. Esto se conoce como function overloading . Las declaraciones de funciones que solo difieren en el tipo de retorno y la especificación noexcept (since C++17) no pueden sobrecargarse. La address of an overloaded function se determina de forma diferente.
|
C++ implementa funciones anónimas utilizando expresiones lambda . |
(desde C++11) |
Objetos función
Además de los lvalues de función, la expresión de llamada a función admite punteros a funciones, y cualquier valor de tipo clase que sobrecargue el operador de llamada a función o sea convertible a puntero de función (incluyendo lambda-expressions ) (since C++11) . Colectivamente, estos tipos se conocen como FunctionObject s , y se utilizan de forma ubicua en la biblioteca estándar de C++, véase por ejemplo, usos de BinaryPredicate y Compare .
La biblioteca estándar también proporciona una serie de plantillas de objetos función predefinidas, así como los métodos para componer nuevas (incluyendo std::less , std::mem_fn , std::bind , std::function (desde C++11) , std::not_fn (desde C++17) , std::bind_front (desde C++20) , std::bind_back , std::move_only_function (desde C++23) , std::copyable_function , y std::function_ref (desde C++26) ).