Strutture dati in C/C++

struct in C e class in C++

In questa lezione rappresenterai un conto bancario con struct in C e con class in C++ e vedrai la differenza tra i due approcci.

Introduzione

In C, struct raggruppa dati collegati tra loro, mentre le funzioni che li elaborano sono scritte a parte. In C++, class riunisce dati e funzioni membro (member function) nello stesso tipo e può nascondere i dati con private per proteggere la coerenza dell'oggetto.

Punti importanti

  • Definisci le condizioni che devono essere sempre vere (invarianti) prima di scrivere le operazioni.
  • Gestisci i casi di struttura vuota, piena e di allocazione di memoria fallita.
  • Valuta insieme la complessità e la gestione della memoria di ogni operazione.

Esempi di codice C e C++

C
Esegui →
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;
}
Risultato dell'esecuzione
Ada: 125.00
C++
Esegui →
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();
}
Risultato dell'esecuzione
Ada: 125.00

Confronto tra C e C++

Nella versione in C, la funzione deposit riceve un puntatore a struct Account e aggiunge l'importo solo se è positivo, ma qualsiasi parte del codice può modificare balance direttamente. Nella versione in C++, balance_ è dichiarato prima di public:, quindi è private per impostazione predefinita e cambia solo tramite metodi validi come deposit(), il che rende molto difficile creare uno stato sbagliato, come un saldo impostato a caso.

C

I dati (struct) e le operazioni sono separati, e la memoria viene allocata e liberata a mano.

C++

Classi e contenitori proteggono la coerenza dei dati e gestiscono da soli le proprie risorse.

Esercizi di approfondimento

Esegui entrambe le versioni e poi modifica il codice per osservare la differenza di sicurezza che offre ciascun linguaggio.

  • Aggiungi test per la struttura vuota e per quando raggiunge la capacità massima.
  • Scrivi la liberazione della memoria e controlla che non ci siano perdite.
  • Confronta la complessità con il contenitore equivalente della libreria standard.

Esercitati con una sfida

Usa ciò che questa lezione spiega per risolvere un problema reale. Ogni sfida gira nel browser, con test immediati e una revisione dell'IA.

Tutte le sfide