Linguaggio C++

Memoria Statica E Dinamica

Studio dei componenti statici in C++: differenza tra variabili di istanza e variabili di classe, utilizzo del modificatore static e gestione dei contatori globali.

Durata

20 minuti

Software

IDE C++

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.

  1. Aggiungi un attributo statico tassoInteresse.
  2. Crea un metodo statico per modificare il tasso per tutti i conti contemporaneamente.
  3. Crea due oggetti ContoCorrente e 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.



C++, OOP, Static, Memory, Class Members, B016,