Il tutorial completo per imparare C++ da zero: la potenza del C unita alla programmazione a oggetti, usata per videogiochi, motori grafici e software ad alte prestazioni.
Introduzione a C++
C++ è un linguaggio creato da Bjarne Stroustrup nel 1985 come estensione del linguaggio C, al quale aggiunge la programmazione a oggetti. Unisce l'efficienza e il controllo di basso livello del C con strumenti di astrazione di alto livello.
È il linguaggio di riferimento per videogiochi (Unreal Engine), motori grafici, applicazioni desktop, software scientifico, sistemi real-time e tutto ciò che richiede massime prestazioni. Padroneggiare C++ significa avere il pieno controllo del computer mantenendo un codice organizzato.
📌 C++ non si esegue nel browser: serve un compilatore (es. g++). In questo corso gli esempi si leggono e si modificano con la sintassi colorata.
Esempio
Sintassi e primo programma
Un programma C++ parte dal main(). Si includono le librerie con #include (qui iostream per l'input/output). La riga using namespace std; evita di scrivere std:: davanti a cout e cin.
Esempio
Output: cout
In C++ si stampa con cout e l'operatore di inserimento <<. endl (o "\n") manda a capo. Puoi concatenare più valori.
Esempio
I commenti
Esempio
Le variabili
Come in C, ogni variabile va dichiarata con il suo tipo. C++ aggiunge auto per dedurre automaticamente il tipo dal valore.
Esempio
I tipi di dato
Tipo
Descrizione
Esempio
int
Intero
42
double
Decimale
3.14
char
Carattere
'A'
bool
Vero/falso
true
string
Testo
"ciao"
A differenza del C, C++ ha il tipo bool nativo e la classe string.
Gli operatori
Esempio
Input: cin
Si legge dalla tastiera con cin e l'operatore di estrazione >>.
Esempio
Le stringhe
La classe string (libreria <string>) rende il testo molto più semplice rispetto al C. Si concatena con + e offre metodi come .length() e .substr().
Esempio
Math in C++
La libreria <cmath> fornisce funzioni matematiche. Per min/max si usano max() e min() di <algorithm>.
Esempio
Booleans in C++
Il tipo bool assume i valori true (1) o false (0). È il risultato di tutte le espressioni di confronto.
Esempio
💡 Usa cout << boolalpha per stampare true/false invece di 1/0.
Le condizioni: if, else if, else
Esempio
Il costrutto switch
Esempio
Il ciclo while
Esempio
Il ciclo for
Esempio
Break e Continue
break interrompe il ciclo; continue salta all'iterazione successiva.
Esempio
Gli array
Esempio
Strutture (struct)
Una struct raggruppa più variabili (anche di tipo diverso) in un unico tipo. In C++ è quasi identica a una classe, ma con membri public di default.
Esempio
Enum
Un enum definisce un insieme di costanti con nomi leggibili. In C++ moderno si preferisce enum class per maggiore sicurezza di tipo.
Esempio
I vector
Il vector è un array dinamico della libreria standard (STL): può crescere e ridursi. È molto più comodo degli array classici.
Esempio
Le funzioni
Le funzioni in C++ possono avere parametri di default e si possono sovraccaricare (overloading): stesso nome, parametri diversi.
Esempio
Riferimenti e puntatori
Un riferimento (&) è un alias di una variabile; un puntatore (*) ne contiene l'indirizzo. Servono per modificare variabili dentro le funzioni ed evitare copie costose.
Esempio
I puntatori
Un puntatore contiene l'indirizzo di memoria di un'altra variabile. Si dichiara con * e si ottiene l'indirizzo con &. A differenza dei riferimenti, può essere null e riassegnato.
Esempio
📌 Riferimento vs puntatore: il riferimento è un alias fisso e sempre valido; il puntatore è più flessibile (può essere null e riassegnato) ma va usato con attenzione.
Gestione della memoria
In C++ si alloca memoria dinamicamente con new e si libera con delete. Il C++ moderno preferisce gli smart pointer (unique_ptr, shared_ptr) che liberano la memoria automaticamente.
new / delete
💡 Regola d'oro: ogni new deve avere il suo delete. Per evitare i memory leak, nel C++ moderno usa sempre gli smart pointer.
Parametri delle funzioni
I parametri possono essere passati per valore (copia), per riferimento (&, modifica l'originale) o con valori di default.
Esempio
Overloading delle funzioni
C++ permette più funzioni con lo stesso nome ma parametri diversi (tipo o numero). Il compilatore sceglie quella giusta in base agli argomenti.
Esempio
Scope delle variabili
Lo scope determina dove una variabile è visibile: locale (nel blocco), globale (ovunque). L'operatore :: accede alla variabile globale se "oscurata" da una locale.
Esempio
Ricorsione
Una funzione ricorsiva chiama se stessa. Serve sempre un caso base per fermarla.
Esempio
Espressioni lambda
Le lambda (C++11) sono funzioni anonime compatte, utili con gli algoritmi STL. Sintassi: [cattura](parametri){ corpo }.
Esempio
💡 La cattura [&] prende le variabili per riferimento, [=] per valore. Le lambda sono fondamentali nel C++ moderno.
Programmazione a oggetti (OOP)
La grande novità di C++ rispetto al C è la programmazione orientata agli oggetti: il codice si organizza in classi e oggetti. I pilastri sono incapsulamento, ereditarietà, polimorfismo e astrazione.
📦 Una classe è lo “stampo”, gli oggetti sono i prodotti creati da quello stampo.
Classi e oggetti
Una classe contiene attributi e metodi. Le sezioni public e private ne controllano la visibilità.
Esempio
Metodi di classe
I metodi sono le funzioni di una classe. Possono essere definiti dentro la classe o fuori usando l'operatore di scope ::.
Esempio
I costruttori
Il costruttore ha lo stesso nome della classe e inizializza l'oggetto al momento della creazione.
Esempio
Access specifier
Gli access specifier controllano la visibilità dei membri di una classe.
Specifier
Accessibile da
public
Ovunque
protected
Dalla classe e dalle classi derivate
private
Solo dalla classe stessa (default per class)
Esempio
L'incapsulamento
Si nascondono gli attributi rendendoli private e si espongono metodi pubblici (getter/setter) per accedervi in modo controllato.
Esempio
Friend functions
Una funzione friend (amica) può accedere ai membri private e protected di una classe, pur non essendone un metodo. Si dichiara con la parola chiave friend.
Esempio
📌 Le friend si usano con parsimonia: rompono l'incapsulamento. Sono utili per l'overloading di operatori come << e per funzioni che operano su due classi.
L'ereditarietà
Una classe può ereditare da un'altra con la sintassi class Figlia : public Genitore.
Esempio
Il polimorfismo
Con i metodi virtual una classe figlia può ridefinire il comportamento del genitore (override), realizzando il polimorfismo.
Esempio
I template
I template permettono di scrivere funzioni e classi generiche, che funzionano con qualsiasi tipo di dato. Sono alla base della STL (vector, map...).
Esempio
Gestione file in C++
C++ gestisce i file con la libreria <fstream>: ofstream per scrivere, ifstream per leggere, fstream per entrambi.
Scrivere e leggere
Data e ora
Con la libreria <ctime> si ottiene data e ora di sistema.
Esempio
Gestione errori in C++
Gli errori in C++ si dividono in tre tipi: sintassi (rilevati dal compilatore), runtime (durante l'esecuzione) e logici (risultati sbagliati). Le eccezioni gestiscono gli errori a runtime in modo controllato.
Errori di sintassi: punto e virgola mancante, parentesi non chiuse — bloccano la compilazione
Errori a runtime: divisione per zero, accesso fuori dai limiti, puntatori nulli
Errori logici: il programma gira ma produce un risultato errato
💡 Compila con g++ -Wall -g programma.cpp per attivare tutti gli avvisi e il debug, poi usa gdb o valgrind per analizzare gli errori a runtime.
Debugging in C++
Il debugging individua e corregge gli errori. Gli strumenti principali sono cout di controllo, il debugger GDB, Valgrind per la memoria e i debugger integrati negli IDE (Visual Studio, CLion, VS Code).
Debug con cerr
📌 cerr è il flusso di errore standard: utile per i messaggi di debug, separati dall'output normale (cout).
Eccezioni (try / catch / throw)
Le eccezioni gestiscono gli errori a runtime senza interrompere bruscamente il programma. Si lancia un'eccezione con throw e si cattura con try/catch.
Esempio
Validazione dell'input
Validare l'input previene crash e comportamenti imprevisti. Con cin.fail() si verifica se la lettura è andata a buon fine.
Esempio
List (lista concatenata)
std::list è una lista doppiamente concatenata: inserimenti e rimozioni in qualsiasi punto sono efficienti (O(1)), ma non c'è accesso casuale tramite indice.
Esempio
Stack (pila LIFO)
std::stack è una struttura LIFO (Last In, First Out): l'ultimo elemento inserito è il primo a uscire.
Esempio
Queue (coda FIFO)
std::queue è una struttura FIFO (First In, First Out): il primo elemento inserito è il primo a uscire, come una fila allo sportello.
Esempio
Deque (coda a doppia entrata)
std::deque (double-ended queue) permette inserimenti e rimozioni efficienti sia in testa che in coda, con accesso casuale tramite indice.
Esempio
Set (insieme ordinato)
std::set memorizza elementi unici e ordinati automaticamente. Inserimento e ricerca sono O(log n).
Esempio
Map (dizionario chiave-valore)
std::map memorizza coppie chiave → valore con chiavi uniche e ordinate. Perfetta per associazioni come nome → voto.
Esempio
Iterator
Un iterator è un oggetto che permette di scorrere gli elementi di un container STL, indipendentemente dal tipo di container.
Esempio
Algoritmi STL
La libreria <algorithm> offre algoritmi pronti per ordinare, cercare, contare e trasformare i container.
Esempio
Namespace
I namespace organizzano il codice ed evitano conflitti di nomi. std è il namespace della libreria standard. Si può creare il proprio.
Esempio
💡 using namespace std; evita di scrivere std:: davanti a tutto, ma nei progetti grandi è meglio qualificare esplicitamente per evitare ambiguità.
Esempi pratici C++
Esempi reali e completi per consolidare C++ con OOP e STL.
Gestione voti con map e vector
Esempio
Classe ContoBancario
Esempio
Editor online C++
Scrivi e leggi codice C++ con la sintassi colorata. Per eseguirlo installa g++ (o usa OnlineGDB), salva come programma.cpp e compila con g++ programma.cpp -o programma && ./programma.
Il tuo codice C++
Quiz C++ — verifica le tue conoscenze
Differenza tra C e C++? Risposta: C++ estende C aggiungendo la programmazione a oggetti (classi), i template, le eccezioni, l'overloading e la STL.
Cos'è un riferimento (&)? Risposta: Un alias di una variabile esistente. A differenza del puntatore non può essere null né riassegnato, e si usa con la sintassi normale.
Differenza tra struct e class? Risposta: Tecnicamente solo la visibilità di default: public nelle struct, private nelle class. Per convenzione struct si usa per dati semplici.
Cos'è il polimorfismo? Risposta: La capacità di trattare oggetti di classi derivate tramite un puntatore/riferimento alla classe base, con metodi virtual risolti a runtime.
A cosa serve la STL? Risposta: La Standard Template Library fornisce container (vector, map, set), iteratori e algoritmi generici pronti all'uso, basati sui template.
Esercizi C++ con soluzioni
Cinque esercizi con soluzione completa. Provaci prima di guardare!
Esercizio 1 — Numeri primi con vector
Soluzione
Esercizio 2 — Inversione stringa
Soluzione
Esercizio 3 — Conta parole con map
Soluzione
Esercizio 4 — Classe Studente
Soluzione
Esercizio 5 — Fibonacci con ricorsione
Soluzione
Sfide C++
🟢 Crea una classe Frazione con overload degli operatori +, - e <<.
🟡 Implementa una rubrica con map<string, string> e menu testuale (aggiungi, cerca, elimina).
🟡 Realizza un template di classe Pila generica che funziona con qualsiasi tipo.
🔴 Crea una gerarchia di classi Forma → Cerchio/Rettangolo/Triangolo con metodo virtuale area() e polimorfismo.
🔴 Implementa un albero binario di ricerca con inserimento, ricerca e visita in-order.
Progetti pratici con C++
🎮 Gioco testuale: avventura a scelte multiple con classi e stati
🏦 Sistema bancario: conti, transazioni, ereditarietà (conto base/premium)
📚 Gestione biblioteca: libri/utenti con STL e persistenza su file
🧮 Calcolatrice con parser: valutazione di espressioni matematiche
📊 Analisi dati: lettura CSV, statistiche con vector e algoritmi STL
🕹️ Snake o Tetris in console con la libreria ncurses
💬 Differenza tra riferimento e puntatore? — Un riferimento è un alias (non può essere null né riassegnato); un puntatore è una variabile che contiene un indirizzo e può essere riassegnato.
💬 Cos'è un metodo virtual? — Un metodo che può essere ridefinito nelle classi derivate e risolto a runtime (late binding), base del polimorfismo.
💬 Cosa sono gli smart pointer? — unique_ptr, shared_ptr, weak_ptr: gestiscono automaticamente la memoria evitando i memory leak (RAII).
💬 Cos'è il RAII? — Resource Acquisition Is Initialization: le risorse si acquisiscono nel costruttore e si rilasciano nel distruttore, garantendo la pulizia automatica.
💬 Differenza tra vector e list? — vector è un array dinamico (accesso casuale O(1), inserimento in mezzo O(n)); list è doppiamente concatenata (inserimento O(1), niente accesso casuale).
💬 Cos'è l'overloading degli operatori? — Permette di ridefinire il comportamento degli operatori (+, ==, <<) per i tipi personalizzati.
📌 C++ è il linguaggio di videogiochi (Unreal Engine), sistemi ad alte prestazioni, software finanziari e applicazioni embedded. Padroneggiarlo apre le porte a ruoli da C++ Developer, Game Developer e Software Engineer.
Riferimento — Parole chiave C++
Keyword
Uso
class, struct
Definiscono tipi personalizzati
public, private, protected
Access specifier
virtual, override
Polimorfismo e metodi ridefinibili
template, typename
Programmazione generica
namespace, using
Organizzazione del codice
new, delete
Allocazione/deallocazione dinamica
try, catch, throw
Gestione eccezioni
const, constexpr
Valori costanti
auto
Deduzione automatica del tipo
friend
Accesso ai membri privati
operator
Overloading degli operatori
this
Puntatore all'oggetto corrente
Riferimento — <iostream> e <fstream>
Elemento
Descrizione
cout
Output su schermo (<<)
cin
Input da tastiera (>>)
cerr
Output di errore (non bufferizzato)
endl
A capo + flush del buffer
getline(cin, s)
Legge un'intera riga in una stringa
ofstream
Scrittura su file
ifstream
Lettura da file
fstream
Lettura e scrittura su file
Riferimento — <string>
Metodo
Descrizione
Esempio
length() / size()
Lunghezza
s.length()
substr(p, n)
Sottostringa
s.substr(0, 3)
find(t)
Posizione di t
s.find("ab")
append() / +
Concatena
s += "x"
replace(p, n, t)
Sostituisce
s.replace(0,2,"X")
at(i) / [i]
Carattere all'indice i
s[0]
empty()
Stringa vuota?
s.empty()
c_str()
Converte in stringa C
s.c_str()
stoi() / to_string()
Conversione numero↔stringa
stoi("42")
Riferimento — <vector>
Metodo
Descrizione
push_back(x)
Aggiunge in coda
pop_back()
Rimuove l'ultimo
size()
Numero di elementi
at(i) / [i]
Accesso all'elemento i
front() / back()
Primo / ultimo elemento
insert() / erase()
Inserisce / rimuove a una posizione
clear()
Svuota il vector
empty()
È vuoto?
begin() / end()
Iteratori inizio / fine
resize(n)
Ridimensiona
Riferimento — <algorithm>
Funzione
Descrizione
sort()
Ordina un intervallo
reverse()
Inverte l'ordine
find()
Cerca un valore
count() / count_if()
Conta occorrenze
min_element() / max_element()
Minimo / massimo
binary_search()
Ricerca binaria (su dati ordinati)
accumulate()
Somma (in <numeric>)
for_each()
Applica una funzione a ogni elemento
transform()
Trasforma gli elementi
unique()
Rimuove duplicati consecutivi
Certificazione C++
Le certificazioni C++ sono molto apprezzate nei settori game dev, finanza e sistemi ad alte prestazioni:
Certificazione
Ente
Livello
CPA — C++ Certified Associate Programmer
C++ Institute / Pearson VUE
Base/Intermedio
CPP — C++ Certified Professional Programmer
C++ Institute
Avanzato
C++ Certification
W3Schools
Base
Come prepararsi
📚 Studia The C++ Programming Language di Bjarne Stroustrup (il creatore del linguaggio)
💻 Pratica con progetti reali: STL, OOP, template, gestione memoria con smart pointer
🛠️ Impara g++, GDB, Valgrind e un IDE (CLion, Visual Studio)
📖 Approfondisci il C++ moderno (C++11/14/17/20): auto, lambda, smart pointer, move semantics
⏱️ Tempo medio di preparazione CPA: 3-4 mesi
Conclusione — E ora?
Hai completato il corso di C++! Hai imparato la sintassi, l'OOP completa, i template, le lambda, la gestione della memoria, le eccezioni e la potente STL. C++ è un linguaggio vasto e potente: padroneggiarlo ti rende un programmatore versatile e ricercato.
E ora cosa fare?
💻 Installa g++ (MinGW su Windows) o un IDE come CLion / Visual Studio
📖 Studia il C++ moderno: smart pointer, move semantics, auto, range-based for, structured bindings
🐙 Pubblica i progetti su GitHub per il tuo portfolio
🎮 Esplora lo sviluppo di videogiochi con Unreal Engine o SFML
⚡ Approfondisci le prestazioni: ottimizzazione, multithreading, programmazione concorrente
🎯 Punta alla certificazione CPA/CPP del C++ Institute
🎯 La tua sfida finale
Crea una gerarchia di classi Forma (base astratta) con Rettangolo, Cerchio e Triangolo, ognuna con il metodo virtuale area(). Usa un vector<Forma*> per gestire forme diverse e trovare quella con l'area maggiore sfruttando il polimorfismo.