Namespaces
Variants

Functions

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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) ).