Skip to content

Strutture (struct)

Immagina di dover tenere traccia di 30 studenti. Ogni studente ha un nome, un’età e un voto. Potresti usare tre array separati — ma è un disastro da gestire.

Una struttura (struct) ti permette di raggruppare tutte le informazioni di uno studente in un unico “pacchetto”. Così hai un array di studenti, non tre array separati.

struct NomeStruttura {
tipo1 campo1;
tipo2 campo2;
// ...
}; // nota il punto e virgola finale!

Esempio concreto:

struct Studente {
string nome;
int eta;
double media;
};
Studente s1; // crea una variabile di tipo Studente
// Accedi ai campi con il punto .
s1.nome = "Alice";
s1.eta = 16;
s1.media = 8.5;
cout << s1.nome << endl; // Alice
cout << s1.media << endl; // 8.5

Puoi impostare tutti i valori in una sola riga:

Studente s1 = {"Alice", 16, 8.5}; // ordine: nome, eta, media
// C++11: puoi anche specificare il nome dei campi
Studente s2 = {.nome = "Bob", .eta = 17, .media = 7.2};

Le strutture si passano alle funzioni esattamente come le variabili normali:

struct Punto {
double x;
double y;
};
// Calcola la distanza tra due punti
double distanza(Punto p1, Punto p2) {
double dx = p1.x - p2.x;
double dy = p1.y - p2.y;
return sqrt(dx*dx + dy*dy);
}
int main() {
Punto a = {0.0, 0.0};
Punto b = {3.0, 4.0};
cout << "Distanza: " << distanza(a, b) << endl; // 5
return 0;
}

Per modificare una struttura dentro una funzione, passa per riferimento (&):

struct Contatore {
int valore;
int passi;
};
void incrementa(Contatore& c, int n) {
c.valore += n; // modifica l'originale, non una copia
c.passi++;
}
int main() {
Contatore c = {0, 0};
incrementa(c, 10);
incrementa(c, 5);
cout << "Valore: " << c.valore << ", Passi: " << c.passi << endl;
// Valore: 15, Passi: 2
return 0;
}

Puoi creare array di strutture per gestire più elementi dello stesso tipo:

struct Prodotto {
string nome;
double prezzo;
int quantita;
};
int main() {
Prodotto magazzino[3] = {
{"Mela", 0.50, 100},
{"Banana", 0.30, 150},
{"Arancia", 0.80, 80}
};
cout << "Prodotti in magazzino:" << endl;
for (int i = 0; i < 3; i++) {
cout << magazzino[i].nome << " - "
<< magazzino[i].prezzo << " euro"
<< " (quantita: " << magazzino[i].quantita << ")" << endl;
}
// Calcola il valore totale
double totale = 0;
for (int i = 0; i < 3; i++) {
totale += magazzino[i].prezzo * magazzino[i].quantita;
}
cout << "Valore totale: " << totale << " euro" << endl;
return 0;
}

Una struttura può contenere un’altra struttura come campo:

struct Indirizzo {
string via;
string citta;
string cap;
};
struct Persona {
string nome;
int eta;
Indirizzo indirizzo; // struttura dentro struttura
};
int main() {
Persona p;
p.nome = "Alice";
p.eta = 16;
p.indirizzo.via = "Via Roma 10";
p.indirizzo.citta = "Milano";
p.indirizzo.cap = "20100";
cout << p.nome << " vive a " << p.indirizzo.citta << endl;
return 0;
}

In C++, struct e class sono quasi identiche. L’unica differenza:

  • In struct tutto è pubblico per default
  • In class tutto è privato per default

Nella pratica, si usa struct per raggruppare dati semplici senza logica, e class per oggetti più complessi con comportamenti e dati protetti.

#include <iostream>
#include <string>
using namespace std;
struct Studente {
string nome;
int eta;
double voto;
};
// Passa per const & per leggere senza copiare
void stampa(const Studente& s) {
cout << s.nome << " (" << s.eta << " anni) - Voto: " << s.voto << endl;
}
int main() {
const int N = 3;
Studente classe[N] = {
{"Alice", 16, 8.5},
{"Bob", 17, 7.0},
{"Carlo", 16, 9.2}
};
cout << "=== Registro ===" << endl;
double somma = 0;
for (int i = 0; i < N; i++) {
stampa(classe[i]);
somma += classe[i].voto;
}
cout << "Media della classe: " << somma / N << endl;
return 0;
}

Output:

=== Registro ===
Alice (16 anni) - Voto: 8.5
Bob (17 anni) - Voto: 7
Carlo (16 anni) - Voto: 9.2
Media della classe: 8.23333