Skip to content

Classi e Oggetti

Immagina di dover gestire le informazioni di una classe scolastica con 30 studenti. Ogni studente ha un nome, un’età e dei voti.

Senza classi, avresti 30 variabili per i nomi, 30 per le età, 30 per i voti — un caos totale. Con le classi, puoi creare un “modello Studente” e poi creare 30 studenti, ognuno con i suoi dati ben organizzati.

Classe vs Oggetto: lo stampo e il prodotto

Section titled “Classe vs Oggetto: lo stampo e il prodotto”

Pensa a una classe come allo stampo per fare i biscotti. Lo stampo definisce la forma — ma non è un biscotto.

Un oggetto è il biscotto vero, creato usando quello stampo. Puoi usare lo stesso stampo per fare decine di biscotti, ognuno diverso (con cioccolato, con glassa, ecc.).

  • Classe = lo stampo (il progetto)
  • Oggetto = il prodotto concreto (l’istanza)
class Cane {
public:
string nome; // caratteristiche (dati)
string razza;
int eta;
void abbaia() { // azioni (funzioni)
cout << nome << " dice: Bau!" << endl;
}
void descrivi() {
cout << nome << " è un/a " << razza
<< " di " << eta << " anni." << endl;
}
};

La parola public: significa che questi dati e queste funzioni sono accessibili dall’esterno della classe.

Una volta definita la classe, puoi creare quanti oggetti vuoi:

Cane c1; // crea un cane (oggetto vuoto)
c1.nome = "Fido"; // imposta i dati con il punto .
c1.razza = "Labrador";
c1.eta = 3;
Cane c2;
c2.nome = "Rex";
c2.razza = "Pastore Tedesco";
c2.eta = 5;
c1.abbaia(); // Fido dice: Bau!
c2.descrivi(); // Rex è un/a Pastore Tedesco di 5 anni.

Il punto . si usa per accedere sia ai dati che alle funzioni di un oggetto.

class Rettangolo {
public:
double base;
double altezza;
// Funzione che calcola l'area
double area() {
return base * altezza;
}
// Funzione che calcola il perimetro
double perimetro() {
return 2 * (base + altezza);
}
};
int main() {
Rettangolo r; // crea un rettangolo
r.base = 5.0; // imposta i dati
r.altezza = 3.0;
cout << "Area: " << r.area() << endl; // 15
cout << "Perimetro: " << r.perimetro() << endl; // 16
return 0;
}

La cosa bella è che area() usa automaticamente base e altezza dell’oggetto su cui viene chiamata. Non devi passarle come parametri.

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

  • In struct tutto è pubblico per default (accessibile dall’esterno)
  • In class tutto è privato per default (non accessibile dall’esterno)

In pratica, si usa struct per semplici raggruppamenti di dati, e class per oggetti più complessi con logica interna.

Puoi passare un oggetto a una funzione come qualsiasi altra variabile. Per evitare di copiarlo, usa const &:

// Legge i dati del cane senza modificarli
void stampaInfoCane(const Cane& c) {
cout << "Nome: " << c.nome << endl;
cout << "Razza: " << c.razza << endl;
cout << "Eta: " << c.eta << " anni" << endl;
}
int main() {
Cane fido;
fido.nome = "Fido";
fido.razza = "Labrador";
fido.eta = 3;
stampaInfoCane(fido); // passa il cane alla funzione
return 0;
}
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Studente {
public:
string nome;
vector<int> voti; // lista di voti
// Aggiunge un voto alla lista
void aggiungiVoto(int voto) {
voti.push_back(voto);
}
// Calcola la media dei voti
double calcolaMedia() {
if (voti.empty()) return 0.0;
int somma = 0;
for (int v : voti) {
somma += v;
}
return (double)somma / voti.size();
}
// Stampa la scheda completa dello studente
void stampaScheda() {
cout << "Studente: " << nome << endl;
cout << "Voti: ";
for (int v : voti) {
cout << v << " ";
}
cout << endl;
cout << "Media: " << calcolaMedia() << endl;
}
};
int main() {
Studente alice;
alice.nome = "Alice";
alice.aggiungiVoto(8);
alice.aggiungiVoto(9);
alice.aggiungiVoto(7);
alice.aggiungiVoto(10);
alice.stampaScheda();
return 0;
}

Output:

Studente: Alice
Voti: 8 9 7 10
Media: 8.5