Guía Completa de Funciones en Programación: Conceptos y Ejemplos
Clasificado en Informática
Escrito el en español con un tamaño de 13,86 KB
Funciones en Programación
Definición y Uso
Funciones: Conjuntos de estatutos encerrados entre llaves {}. Cada función tiene un nombre único y define lo que hace la función. Son bloques básicos de construcción en los programas.
Uso: Evita la duplicación de código al encapsular un conjunto de instrucciones que se utilizan repetidamente en un solo lugar, facilita la modificación y mantenimiento del código.
Estructura de una Función
Las funciones aceptan valores a través de parámetros, usan esos valores en su proceso y devuelven un resultado. Además, tanto los parámetros como el valor de retorno son opcionales, lo que brinda flexibilidad en su uso.
Ejemplo: `int Suma(int valor1, int valor2) { return valor1 + valor2; }`
- `Suma` es el nombre de la función.
- `int` es el tipo de valor de retorno.
- `(int valor1, int valor2)` son parámetros de entrada. Se define el tipo y la variable y se separan por comas.
- `return valor1 + valor2;` es la instrucción que regresa el valor de tipo entero.
`void` es una palabra clave que indica que no vamos a regresar un valor. El cuerpo de la función es el bloque de código que se ejecuta cuando la función es llamada.
Prototipo o Firma de una Función
El prototipo/signature o firma de una función es la información que describe la función, incluyendo su tipo de retorno, nombre y los tipos y órdenes de sus parámetros. Se utiliza para informar al compilador sobre la existencia de la función antes de su implementación, lo que es útil cuando se definen funciones después de su uso en el código principal o cuando están en diferentes archivos.
Argumentos de una Función
Los argumentos son los valores pasados a la función cuando se llama. Pueden ser utilizados por la función para realizar operaciones y devolver resultados.
Tipos de Argumentos
- Argumentos Determinados: Tanto el número como el tipo de argumentos están definidos en la declaración de la función.
- Argumentos por Omisión: Puedes proporcionar valores predeterminados para algunos de los parámetros de una función. Estos parámetros se convierten en argumentos opcionales cuando la función es llamada.
- Número Variable de Argumentos: Puedes utilizar el `std::initializer_list` o los puntos suspensivos (...) para permitir un número variable de argumentos.
- Argumentos Sobrecargados: Las funciones pueden tener el mismo nombre, pero con diferentes tipos o números de argumentos. Esto se llama sobrecarga de funciones.
- Argumentos Vacíos: Las funciones también pueden no tener argumentos.
Parámetros vs. Argumentos
Parámetro: Variable utilizada en la declaración de una función para representar el valor que la función espera recibir cuando se llama. (Ejemplo: `a`, `b`)
Argumento: Valor real que se pasa a una función durante su llamada, asignándose a los parámetros. (Ejemplo: `3.5`)
Llamada a una Función
Para usar una función debemos llamarla o invocarla. Si la función acepta parámetros se deben suministrar los argumentos correspondientes (esto no es opcional).
Definición de la Función
Definición de la función: Es simplemente el prototipo de la función y su cuerpo.
Organización del Código
Definir las funciones antes del `main()`: Se debe usar en situaciones muy especiales como es el uso de funciones en línea (inline functions) o en el uso de plantillas de función (function templates).
Separar las funciones en archivos externos con extensión .cpp y definir sus prototipos en archivos con extensión .h, permite una organización más limpia del código, se evita tener que declarar la firma de cada función en cada archivo que quiera utilizarlas, es común crear archivos de encabezado (con extensión .h) para cada función.
`#pragma once` es un preprocesador utilizada en archivos de encabezado que evita la inclusión redundante del mismo archivo en un programa. Al incluirlo se garantiza que dicho archivo solo se incluirá una vez durante la compilación, evitando así problemas como definiciones múltiples y otros errores asociados con la inclusión repetida de archivos de encabezado.
Sobrecarga de Funciones
La sobrecarga de funciones permite definir múltiples funciones con el mismo nombre pero con diferentes parámetros. Permite que una función realice diferentes operaciones según los argumentos proporcionados en la invocación, es un tipo de polimorfismo estático.
Plantillas de Funciones
Las plantillas de funciones (function templates): Característica que define funciones que pueden trabajar con diferentes tipos de datos sin tener que escribir múltiples versiones de la misma función para cada tipo de datos. Proporcionan una forma de escribir código genérico que puede ser reutilizado con diferentes tipos.
Un function template se define utilizando la palabra clave `template` seguida de un conjunto de parámetros de plantilla.
Variables y Constantes
Variables
Las variables representan una entidad esencial en cualquier programa, ya que sus valores determinan el resultado de la ejecución del programa.
El ámbito, scope o alcance: Es el espacio de código en el que existe y desde el cual puede ser modificada.
Las variables de alcance global son más susceptibles a errores, están disponibles durante todo el ciclo de vida.
Las variables locales tienen menor probabilidad de errores debido a su vida limitada.
Constantes
Constantes: Valor que no cambia durante toda la ejecución del programa (`const`). Sus beneficios son legibilidad, seguridad y optimización del código. La sintaxis es: `const tipo_dato nombre = valor;`
Variables Estáticas
Las variables estáticas mantienen sus valores durante toda la ejecución del programa. Pueden ser globales por defecto o locales si se declara con "static". Conservan su valor entre llamadas sucesivas a la función y no son accesibles desde fuera, lo que favorece el principio de encapsulación de datos. Se inicializan a cero si no se les asigna un valor. Son útiles en la recursividad pero dentro de las clases comparten el mismo espacio para todos los objetos, lo que puede causar problemas.
Arreglos y Matrices
Arreglos
Arreglo: Estructura de datos que almacena elementos del mismo tipo de forma contigua en memoria. Se puede considerar un conjunto ordenado de elementos accesibles mediante un índice. Cuando el arreglo es unidimensional, se le denomina vector.
Características de los Arreglos
- Tamaño Fijo: La longitud de un arreglo se fija en el momento de la declaración y no puede cambiar durante la ejecución.
- Índices: Índices enteros no negativos. El índice del primer elemento es 0, y del último es tamaño - 1.
- Inicialización: Los elementos de un arreglo pueden inicializarse al declararlos.
- Iteración: Se pueden recorrer los elementos utilizando bucles.
Matrices
Matrices: Estructuras de datos bidimensionales que permiten organizar y manipular datos de manera eficiente en programas. Se trabaja con matrices utilizando arreglos bidimensionales.
Punteros
Definición
Punteros: Variables que almacenan la dirección de memoria de otra variable, en lugar de su valor. Permiten manipular indirectamente el valor de la variable a la que apuntan. No necesitan inicialización al declararse y se denotan con el operador *. Por ejemplo: `int *ptr;`
Si se declaran varios punteros en una misma línea, cada uno debe ir precedido por *. (Ejemplo: `int *ptr1, *ptr2`)
El tipo asignado al puntero debe coincidir con el tipo de la variable a la que apunta.
Operador de Dirección
El operador de dirección, representado por `&`, se utiliza para obtener la dirección de memoria de una variable. Al aplicarse a una variable, devuelve la dirección en la memoria donde está almacenada esa variable.
Operador de Desreferencia
El Operador de desreferencia (dereference operator) Después de crear un puntero a una variable podemos acceder al valor de la variable a través del apuntador usando el operador `*` (también llamado dereference operator). Permite leer o escribir de manera indirecta a la variable a través del puntero.
Puntero Nulo
El apuntador nulo (`NULL` o null pointer) inicializa punteros cuando no se desea asignarles una dirección de memoria válida. En C++11, se recomienda utilizar `nullptr` en lugar de `NULL`. Intentar acceder o modificar el valor al que apunta un puntero nulo resultará en una violación de acceso.
Función Swap
La función Swap recibe dos valores y los intercambia.
Referencias
Las referencias son alias de variables que se crean con el operador `&` durante la declaración y siempre necesitan un inicializador. Se enlazan al referente y no pueden ser enlazadas a otra variable más adelante. A diferencia de los punteros, las referencias no son variables nuevas y no se separa memoria para ellas.
Referencias vs. Punteros
Característica | Referencia | Puntero |
---|---|---|
Inicialización | Inicializada | Opcional |
Valor Nulo | No nula | Puede ser `nullptr` |
Enlace | Enlaza su referente | Apunta a otra variable y puede apuntar a otras variables a lo largo de su vida |
Almacenamiento | No almacenamiento adicional | Requiere almacenamiento |
Desreferencia | No desreferencia | Requiere desreferencia |
Aritmética de Punteros
La aritmética de apuntadores permite realizar operaciones matemáticas directamente sobre direcciones de memoria. Es útil al trabajar con arrays y estructuras de datos.
No es necesario utilizar el operador "&" al declarar un puntero que apunta a un array.
Arreglo de Punteros
Un arreglo de apuntadores es una estructura que almacena múltiples punteros en secuencia. Cada elemento del arreglo es un puntero que puede apuntar a una variable de un tipo específico.
Beneficios:
- Dinamismo en la Asignación de Memoria.
- Manipulación Eficiente de Direcciones de Memoria.
- Implementación de Estructuras de Datos Dinámicas.
Punteros a Funciones
Los apuntadores a funciones permiten almacenar y manipular direcciones de funciones. Esto brinda flexibilidad y dinamismo en situaciones en las que se requiere seleccionar o cambiar dinámicamente el comportamiento de una función.
Un puntero a función almacena la dirección de memoria de una función. La sintaxis para declarar un apuntador a función implica especificar el tipo de retorno y los tipos de parámetros de la función a la que apunta el puntero.
Strings (std::string)
La clase `std::string` proporciona una interfaz fácil de usar para manejar cadenas de caracteres (strings). Esta clase es parte del espacio de nombres `std` y se encuentra en la cabecera ``.
Métodos Comunes de std::string
- `length()` o `size()`: Devuelve la longitud de la cadena.
- `substr(pos, len)`: Devuelve una subcadena que comienza en la posición `pos` y tiene una longitud `len`. El índice inicia en cero.
- `find(str)`: Devuelve la posición de la primera ocurrencia de la subcadena `str`. Si no se encuentra, devuelve `std::string::npos`. El tipo de dato `size_t` representa el tamaño máximo posible de un objeto de cualquier tipo.
- `append(str)`: Añade la cadena `str` al final de la cadena actual.
Secuencias de Escape
Las secuencias de escape son combinaciones de caracteres que representan caracteres especiales. Por ejemplo: `\t` es interpretado como un tabulador y `\n` es interpretado como una nueva línea.
Raw String Literals
Los Raw String Literals (Literales de Cadena sin Procesar) son cadenas de caracteres que ignoran secuencias de escape. Su sintaxis es: `R("texto")`.
Delimitador Personalizado
El Delimitador personalizado permite elegir tus propios delimitadores para definir el inicio y el final del raw string literal. Esto permite utilizar delimitadores que no aparecen en el contenido de la cadena, evitando así la necesidad de escapar secuencias de caracteres dentro de la cadena. No debe ser mayor a 16 caracteres y no debe tener espacios en blanco o `\`.
Manejo de Archivos
Las operaciones más comunes con archivos incluyen la lectura y escritura de datos. Se utilizan las clases `ifstream` (para leer), `ofstream` (para escribir) y `fstream` (para ambos).
Es importante verificar si la apertura de un archivo fue exitosa antes de realizar operaciones sobre él. Esto se logra mediante el método `is_open()`.
Para comprobar la existencia de un archivo en Windows se utiliza la función `std::ifstream` junto con el método `is_open()`.
Para mantener la información del archivo y grabar nueva al final se usa `std::ofstream` con el modo `std::ios::app`.
Para eliminar un archivo se utiliza la función `std::remove` de la biblioteca ``.