4.1 Funciones de Biblioteca: ¿Qué Son Exactamente Las Librerías?
4.1 Funciones de Biblioteca: ¿Qué Son Exactamente Las Librerías?
4.1 Funciones de Biblioteca: ¿Qué Son Exactamente Las Librerías?
1 FUNCIONES DE BIBLIOTECA
Junto con los compiladores de C y C++, se incluyen ciertos archivos llamados
bibliotecas mas comúnmente librerías. Las bibliotecas contienen el código objeto
de muchos programas que permiten hacer cosas comunes, como leer el teclado,
escribir en la pantalla, manejar números, realizar funciones matemáticas, etc.
Las bibliotecas están clasificadas por el tipo de trabajos que hacen, hay bibliotecas
de entrada y salida, matemáticas, de manejo de memoria, de manejo de textos y
como imaginarás existen muchísimas librerías disponibles y todas con una función
especifica.
Nota 2: Sé que esto pinta aburrido, pero es muy útil y las librerías nos facilitan
enormemente el trabajo a la hora de programar. Recuerda que antes de hablar
librerías y demás es necesario dominar algunos conceptos de fundamentación en
general y otros temas importantes (ciclos, condicionales y demás) Ahora veamos
algunas librerías y como es su sintaxis.X
Las librerías no son únicamente archivos externos creados por otros, también es
posible crear nuestras propias librerías y utilizarlas en nuestros programas. Las
librerías pueden tener varias extensiones diferentes, las más comunes
son: .lib, .bpl, .a, .dll, .h y algunas más ya no tan comunes.
En conclusión: Las librearías son archivos (no siempre externos) que nos permiten
llevar a cabo diferentes tareas sin necesidad de preocuparnos por cómo se hacen
sino simplemente entender cómo usarlas. Las librearías en C++ permiten hacer
nuestros programas más modulares y reutilizables, facilitando además crear
programas con funcionalidades bastante complejas en unas pocas líneas de
código.
C++Copiar
int sum(int a, int b)
{
return a + b;
}
C++Copiar
int main()
{
int i = sum(10, 32);
int j = sum(i, 66);
cout << "The value of j is" << j << endl; // 108
}
No hay ningún límite práctico para la longitud de la función, pero un buen diseño
tiene como objetivo funciones que realizan una sola tarea bien definida. Los
algoritmos complejos deben dividirse en funciones más sencillas y fáciles de
comprender siempre que sea posible.
Las funciones se pueden sobrecargar, lo que significa que distintas versiones de una
función pueden compartir el mismo nombre si difieren en el número o el tipo de
parámetros formales. Para obtener más información, vea Sobrecarga de funciones.
Elementos de una declaración de función
C++Copiar
int sum(int a, int b);
Una definición de función consta de una declaración, más el cuerpo, que es todo el
código entre las llaves:
C++Copiar
int sum(int a, int b)
{
return a + b;
}
1. Tipo de valor devuelto, que especifica el tipo del valor que devuelve la
función, void o si no se devuelve ningún valor. En C++11, es auto un
tipo de valor devuelto válido que indica al compilador que infiere el
tipo de la instrucción return. En C++14, decltype(auto) también se
permite. Para obtener más información, consulte más adelante
Deducción de tipos en tipos de valor devueltos.
2. El nombre de función, que debe comenzar con una letra o un carácter
de subrayado y no puede contener espacios. En general, un carácter de
subrayado inicial en los nombres de función de la biblioteca estándar
indica funciones de miembro privado o funciones no miembro que no
están pensadas para que las use el código.
3. La lista de parámetros, que es un conjunto delimitado por llaves y
separado por comas de cero o más parámetros que especifican el tipo
y, opcionalmente, un nombre local mediante el cual se puede acceder
a los valores de dentro del cuerpo de la función.
Los elementos opcionales de una declaración de función son los siguientes:
C++Copiar
constexpr float exp(float x, int n)
{
return n == 0 ? 1 :
n % 2 == 0 ? exp(x * x, n / 2) :
exp(x * x, (n - 1) / 2) * x;
};
2. Su especificación de vinculación, extern o static.
C++Copiar
//Declare printf with C linkage.
extern "C" int printf( const char *fmt, ... );
C++Copiar
inline double Account::GetBalance()
{
return balance;
}
C++Copiar
#include <type_traits>
template <typename T>
T copy_object(T& obj) noexcept(std::is_pod<T>) {...}
Definiciones de función
C++Copiar
int foo(int i, std::string s)
{
int value {i};
MyClass mc;
if(strcmp(s, "default") != 0)
{
value = mc.do_something(i);
}
return value;
}
Las variables declaradas dentro del cuerpo se denominan variables locales. Se salen
del ámbito cuando finaliza la función; por lo tanto, una función nunca debe
devolver una referencia a una variable local.
C++Copiar
MyClass& boom(int i, std::string s)
{
int value {i};
MyClass mc;
mc.Initialize(i,s);
return mc;
}
Funciones const y constexpr
Plantillas de función
C++Copiar
template<typename Lhs, typename Rhs>
auto Add2(const Lhs& lhs, const Rhs& rhs)
{
return lhs + rhs;
}
Una función tiene una lista de parámetros separados por comas de cero o más
tipos, cada uno de los cuales tiene un nombre mediante el cual se puede acceder a
ellos dentro del cuerpo de la función. Una plantilla de función puede especificar
parámetros adicionales de tipo de valor. El llamador pasa argumentos, que son
valores concretos cuyos tipos son compatibles con la lista de parámetros.
C++Copiar
void DoSomething(std::string& input){...}
Cuando una función modifica un argumento que se pasa por referencia, modifica el
objeto original, no una copia local. Para evitar que una función modifique este tipo
de argumento, califique el parámetro como const&:
C++Copiar
void DoSomething(const std::string& input){...}
C++Copiar
void DoSomething(const std::string&& input){...}
C++Copiar
// OK same as GetTickCount()
long GetTickCount( void );
Argumentos predeterminados
C++Copiar
int DoSomething(int num,
string str,
Allocator& alloc = defaultAllocator)
{ ... }
Es posible que una función no devuelva otra función o una matriz integrada; sin
embargo, puede devolver punteros a estos tipos, o una expresión lambda, que
genera un objeto de función. Excepto en estos casos, una función puede devolver
un valor de cualquier tipo que esté en el ámbito o no devolver ningún valor, en
cuyo caso el tipo de valor devuelto es void.
C++Copiar
template<typename Lhs, typename Rhs>
auto Add(const Lhs& lhs, const Rhs& rhs) -> decltype(lhs + rhs)
{
return lhs + rhs;
}
Cuando auto se usa junto con un tipo de valor devuelto final, solo sirve como
marcador de posición para cualquier expresión decltype que produzca y no realiza
por sí mismo la deducción de tipos.
En C++, una variable local se puede declarar como estática. La variable solo es
visible dentro del cuerpo de la función, pero existe una copia única de la variable
para todas las instancias de la función. Los objetos estáticos locales se destruyen
durante la finalización especificada por atexit. Si no se crea un objeto estático
porque el flujo de control de programa omitió su declaración, no se realiza ningún
intento de destruir ese objeto.
Deducción de tipos en los tipos de valor devueltos (C++14)
C++Copiar
template<typename Lhs, typename Rhs>
auto Add2(const Lhs& lhs, const Rhs& rhs)
{
return lhs + rhs; //returns a non-const object by value
}
Tenga en auto cuenta que no conserva la const-ness del tipo que deduce. Para las
funciones de reenvío cuyo valor devuelto necesita conservar la const-ness o ref-
ness de sus argumentos, decltype(auto) puede usar la palabra clave , decltype que
usa las reglas de inferencia de tipos y conserva toda la información de
tipo. decltype(auto)Puede usar como valor de retorno normal a la izquierda o
como valor devuelto final.
C++Copiar
template<typename F, typename Tuple = tuple<T...>, int... I>
decltype(auto) apply_(F&& f, Tuple&& args, index_sequence<I...>)
{
return std::forward<F>(f)(std::get<I>(std::forward<Tuple>(args))...);
}
C++Copiar
#include <string>
#include <iostream>
struct S
{
string name;
int num;
};
S g()
{
string t{ "hello" };
int u{ 42 };
return { t, u };
}
int main()
{
S s = g();
cout << s.name << " " << s.num << endl;
return 0;
}
C++Copiar
#include <tuple>
#include <string>
#include <iostream>
// --or--
int myval;
string myname;
double mydecimal;
tie(myval, myname, mydecimal) = f();
cout << myval << " " << myname << " " << mydecimal << endl;
return 0;
}
C++Copiar
#include <tuple>
#include <string>
#include <iostream>
S g()
{
string t{ "hello" };
int u{ 42 };
return { t, u };
}
int main()
{
auto[x, y, z] = f(); // init from tuple
cout << x << " " << y << " " << z << endl;
Punteros de función
C++Copiar
typedef int (*fp)(int);
fp myFunction(char* s); // function returning function pointer
C++Copiar
int (*myFunction(char* s))(int);