Concetto Intuitive: Pensa a una classe
Cittadino. Il "nome" è non statico (ogni cittadino ne ha uno diverso). Il "nome della nazione" è statico (è lo stesso per tutti i cittadini e appartiene alla nazione stessa).
1.4 Attributi e Metodi Statici
1.4.1 Variabili di Istanza (Non Statiche)
Sono le variabili classiche viste finora. Ogni volta che fai new, viene allocato spazio in memoria per queste variabili. Se cambi il nome all'oggetto A, l'oggetto B non ne risente.
1.4.2 Variabili di Classe (Statiche)
Esistono in una sola copia per tutta la classe. Tutti gli oggetti condividono la stessa identica area di memoria per quella variabile. Se l'oggetto A modifica una variabile statica, l'oggetto B vedrà il valore modificato.
LABORATORIO
Il Contatore di Oggetti
Implementeremo un sistema che tiene traccia di quanti oggetti "Utente" sono stati creati (e quanti sono rimasti attivi).
Esempio Pratico: Classe Utente
#include <iostream>
#include <string>
using namespace std;
class Utente {
private:
string username; // Non statica: ogni utente ha la sua
public:
// Attributo STATICO: appartiene alla classe, non all'oggetto
static int contatoreUtenti;
Utente(string u) : username(u) {
contatoreUtenti++; // Incremento il contatore globale ogni volta che nasce un utente
cout << "Utente " << username << " creato." << endl;
}
~Utente() {
contatoreUtenti--; // Decremento quando un utente viene distrutto
cout << "Utente " << username << " rimosso." << endl;
}
// Metodo STATICO: può essere chiamato senza creare un oggetto!
static void mostraTotale() {
cout << "Utenti attualmente online: " << contatoreUtenti << endl;
}
};
// In C++, le variabili statiche vanno inizializzate fuori dalla classe
int Utente::contatoreUtenti = 0;
Test nel Main
int main() {
// Posso chiamare il metodo statico anche se non ci sono utenti!
Utente::mostraTotale();
Utente* u1 = new Utente("Alice");
Utente* u2 = new Utente("Bob");
Utente::mostraTotale(); // Visualizzerà 2
delete u1; // Distruggo Alice
Utente::mostraTotale(); // Visualizzerà 1
return 0;
}
Quando usare "static"?
- Contatori: Per sapere quante istanze di una classe esistono.
- Costanti comuni: Ad esempio il valore di PI GRECO in una classe
Geometria. - Funzioni di utilità: Metodi che fanno calcoli matematici ma non hanno bisogno di dati salvati nell'oggetto (es.
Math::radiceQuadrata(n)).
Esercitazione Proposta
Task: Crea una classe Banca.
- Aggiungi un attributo statico
tassoInteresse. - Crea un metodo statico per modificare il tasso per tutti i conti contemporaneamente.
- Crea due oggetti
ContoCorrentee verifica che, cambiando il tasso tramite la classe, entrambi gli oggetti vedano il nuovo valore.
I membri statici sono come il regolamento della scuola: è uno solo per tutti gli studenti. I membri non statici sono come lo zaino: ogni studente ha il suo, con dentro libri diversi.