cpp-retorno-funciones

Retorno de funciones en C++

En C++, el retorno de una función es el mecanismo mediante el cual una función puede (opcionalmente) devolver un valor al código que la invocó. Esto se realiza usando la palabra clave return.

El valor devuelto puede ser de cualquier tipo de dato (tipos primitivos, structs, objetos…). También es posible que una función no devuelva ningún valor, lo cual se indica con el tipo de retorno void.

En general, únicamente podemos devolver solo un valor directamente. Pero podemos devolver una agrupación de varios (por ejemplo, estructuras o clases).

Retorno de void

Cuando una función no necesita devolver ningún valor, se declara con el tipo de retorno void. En este caso, la función realiza una acción sin proporcionar un resultado.

#include <iostream>

void Saludar() {
    std::cout << "¡Hola!" << std::endl;
}

int main() {
    Saludar(); // Imprime "¡Hola!"
    return 0;
}

Retorno de un valor

Para devolver un valor desde una función, se utiliza la palabra reservadareturn. El tipo de retorno de la función debe coincidir con el tipo del valor devuelto.

Al alcanzar una instrucción return, la ejecución de la función se detiene y el control se devuelve a la función que realizó la llamada.

#include <iostream>

int Sumar(int a, int b) {
    return a + b;
}

int main() {
    int resultado = Sumar(3, 4);
    std::cout << "La suma es: " << resultado << std::endl; // Imprime "La suma es: 7"
    return 0;
}

Retorno de múltiples valores

Aunque no se puede devolver directamente más de un valor desde una función, hay varias técnicas para devolver múltiples valores en C++:

Usar clases o estructuras

Una forma común es encapsular los valores en una clase o estructura y devolver una instancia de esa clase o estructura.

#include <iostream>

struct Resultado {
    int numero;
    std::string texto;
};

Resultado ObtenerResultado() {
    return {42, "Ejemplo"};
}

int main() {
    Resultado res = ObtenerResultado();
    std::cout << "Número: " << res.numero << ", Texto: " << res.texto << std::endl; // Imprime "Número: 42, Texto: Ejemplo"
    return 0;
}

Retorno de colecciones

Las funciones también pueden devolver colecciones como arreglos, vectores, listas o mapas.

#include <iostream>
#include <vector>

std::vector<int> ObtenerLista() {
    return {1, 2, 3, 4, 5};
}

int main() {
    std::vector<int> lista = ObtenerLista();
    for (int num : lista) {
        std::cout << num << " ";
    }
    std::cout << std::endl; // Imprime "1 2 3 4 5"
    return 0;
}

Usar tuplasc++17 y superior

A partir de C++17, se pueden usar tuplas para devolver múltiples valores. Las tuplas permiten agrupar valores de diferentes tipos en un solo objeto.

#include <iostream>
#include <tuple>

std::tuple<int, std::string> ObtenerDatos() {
    return {42, "Ejemplo"};
}

int main() {
    auto [numero, texto] = ObtenerDatos();
    std::cout << "Número: " << numero << ", Texto: " << texto << std::endl; // Imprime "Número: 42, Texto: Ejemplo"
    return 0;
}

Ejemplos prácticos

Ejemplo de función void

En este ejemplo, se muestra cómo definir una función que no retorna ningún valor usando void.

#include <iostream>

void MostrarMensaje(const std::string &mensaje) {
    std::cout << mensaje << std::endl;
}

int main() {
    MostrarMensaje("Hola, Mundo!"); // Imprime "Hola, Mundo!"
    return 0;
}

Ejemplo de función con retorno de valor

En este ejemplo, se muestra cómo definir una función que retorna un valor calculado, en este caso, el área de un círculo.

#include <iostream>
#include <cmath> // Para la constante M_PI

double CalcularAreaCirculo(double radio) {
    return M_PI * radio * radio;
}

int main() {
    double area = CalcularAreaCirculo(5.0);
    std::cout << "El área del círculo es: " << area << std::endl; // Imprime "El área del círculo es: 78.5398"
    return 0;
}

Ejemplo de función con retorno de tupla

En este ejemplo, se muestra cómo definir una función que retorna una tupla con dos valores calculados.

#include <iostream>
#include <tuple>

std::tuple<int, int> CalcularSumaYProducto(int a, int b) {
    return {a + b, a * b};
}

int main() {
    auto [suma, producto] = CalcularSumaYProducto(3, 4);
    std::cout << "Suma: " << suma << ", Producto: " << producto << std::endl; // Imprime "Suma: 7, Producto: 12"
    return 0;
}

Ejemplo de función con retorno de clase

En este ejemplo, se muestra cómo definir una función que retorna una instancia de una clase. Aquí, se crea una instancia de la clase Persona.

#include <iostream>

class Persona {
public:
    std::string nombre;
    int edad;
};

Persona CrearPersona(const std::string &nombre, int edad) {
    return {nombre, edad};
}

int main() {
    Persona persona = CrearPersona("Luis", 30);
    std::cout << "Nombre: " << persona.nombre << ", Edad: " << persona.edad << std::endl; // Imprime "Nombre: Luis, Edad: 30"
    return 0;
}