Estructuras de datos en C/C++

struct en C y class en C++

En esta lección vas a modelar una cuenta bancaria con struct en C y con class en C++ para ver la diferencia entre los dos enfoques.

Introducción

En C, struct agrupa datos relacionados, y las funciones que los procesan se escriben aparte. En C++, class reúne datos y funciones miembro (member functions) en un mismo tipo y puede ocultar los datos con private para proteger la coherencia del objeto.

Puntos importantes

  • Define las condiciones que siempre deben cumplirse (invariantes) antes de escribir las operaciones.
  • Trata los casos de estructura vacía, llena y de fallo al reservar memoria.
  • Evalúa a la vez la complejidad y la gestión de memoria de cada operación.

Ejemplos de código C y C++

C
Ejecutar →
main.c
#include <stdio.h>

typedef struct {
    const char *owner;
    double balance;
} Account;

void deposit(Account *account, double amount) {
    if (amount > 0) {
        account->balance += amount;
    }
}

int main(void) {
    Account account = {"Ada", 100.0};
    deposit(&account, 25.0);
    printf("%s: %.2f\n", account.owner, account.balance);
    return 0;
}
Resultado de la ejecución
Ada: 125.00
C++
Ejecutar →
main.cpp
#include <iomanip>
#include <iostream>
#include <string>
#include <utility>

class Account {
    std::string owner_;
    double balance_;

public:
    Account(std::string owner, double balance)
        : owner_(std::move(owner)), balance_(balance) {}

    void deposit(double amount) {
        if (amount > 0) {
            balance_ += amount;
        }
    }

    void print() const {
        std::cout << owner_ << ": " << std::fixed
                  << std::setprecision(2) << balance_ << '\n';
    }
};

int main() {
    Account account("Ada", 100.0);
    account.deposit(25.0);
    account.print();
}
Resultado de la ejecución
Ada: 125.00

Comparación entre C y C++

En la versión de C, la función deposit recibe un puntero a struct Account y solo suma el importe si es positivo, pero cualquier código puede modificar balance directamente. En la versión de C++, balance_ se declara antes de public:, así que es private por defecto y solo cambia mediante métodos válidos como deposit(), lo que hace muy difícil llegar a un estado incorrecto, como un saldo puesto al azar.

C

Los datos (struct) y las operaciones están separados, y la memoria se reserva y se libera a mano.

C++

Las clases y los contenedores protegen la coherencia de los datos y gestionan sus propios recursos.

Ejercicios de práctica

Ejecuta las dos versiones y después modifica el código para ver la diferencia de seguridad que aporta cada lenguaje.

  • Añade pruebas para el estado vacío y para el momento en que se alcanza la capacidad máxima.
  • Escribe la liberación de la memoria y comprueba que no haya fugas.
  • Compara la complejidad con la del contenedor equivalente de la biblioteca estándar.

Practica con un reto

Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.

Todos los retos