HTML CSS JAVASCRIPT SQL MYSQL PYTHON JAVA PHP C C++ C# PACKET TRACER CYBERSECURITY REACTTYPESCRIPTNODE.JSGIT & GITHUBDATA SCIENCEBOOTSTRAPGOKOTLINJQUERYDJANGOVUEANGULAR MONGODB POSTGRESQL SASS NUMPY PANDAS SCIPY DSA RUST SWIFT BASHXMLW3.CSSANGULARJSAIAWSPROGRAMMAZIONEEXCEL WORD POWERPOINT
Corso gratuito

Corso di C++ in italiano

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

TipoDescrizioneEsempio
intIntero42
doubleDecimale3.14
charCarattere'A'
boolVero/falsotrue
stringTesto"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.

SpecifierAccessibile da
publicOvunque
protectedDalla classe e dalle classi derivate
privateSolo 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

  1. Differenza tra C e C++?
    Risposta: C++ estende C aggiungendo la programmazione a oggetti (classi), i template, le eccezioni, l'overloading e la STL.
  2. 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.
  3. 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.
  4. 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.
  5. 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++

  1. 🟢 Crea una classe Frazione con overload degli operatori +, - e <<.
  2. 🟡 Implementa una rubrica con map<string, string> e menu testuale (aggiungi, cerca, elimina).
  3. 🟡 Realizza un template di classe Pila generica che funziona con qualsiasi tipo.
  4. 🔴 Crea una gerarchia di classi Forma → Cerchio/Rettangolo/Triangolo con metodo virtuale area() e polimorfismo.
  5. 🔴 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

Programma completo del corso C++

ModuloArgomentiOre
1 — BasiInstallazione g++, cout/cin, variabili, tipi, operatori, math, booleans6
2 — ControlloIf/else, switch, while, for, break/continue4
3 — DatiArray, struct, enum, riferimenti, puntatori, gestione memoria6
4 — FunzioniParametri, overloading, scope, ricorsione, lambda6
5 — OOPClassi, costruttori, access specifier, incapsulamento, friend7
6 — OOP avanzatoEreditarietà, polimorfismo, template, file, date7
7 — ErroriEccezioni, debugging, validazione input4
8 — STLVector, list, stack, queue, set, map, iteratori, algoritmi8
9 — ProgettoRealizzazione di un progetto completo8

Piano di studio C++ (8 settimane)

SettimanaObiettivo
1Installazione g++, cout/cin, variabili, tipi, operatori, math, booleans
2If/else, switch, cicli, break/continue, array
3Struct, enum, riferimenti, puntatori, gestione memoria
4Funzioni: parametri, overloading, scope, ricorsione, lambda
5OOP: classi, costruttori, access specifier, incapsulamento, friend
6Ereditarietà, polimorfismo, template, file, eccezioni
7STL: vector, list, stack, queue, set, map, iteratori, algoritmi
8Namespace, progetto finale

Domande da colloquio C++

  • 💬 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.

Riferimento — Parole chiave C++

KeywordUso
class, structDefiniscono tipi personalizzati
public, private, protectedAccess specifier
virtual, overridePolimorfismo e metodi ridefinibili
template, typenameProgrammazione generica
namespace, usingOrganizzazione del codice
new, deleteAllocazione/deallocazione dinamica
try, catch, throwGestione eccezioni
const, constexprValori costanti
autoDeduzione automatica del tipo
friendAccesso ai membri privati
operatorOverloading degli operatori
thisPuntatore all'oggetto corrente

Riferimento — <iostream> e <fstream>

ElementoDescrizione
coutOutput su schermo (<<)
cinInput da tastiera (>>)
cerrOutput di errore (non bufferizzato)
endlA capo + flush del buffer
getline(cin, s)Legge un'intera riga in una stringa
ofstreamScrittura su file
ifstreamLettura da file
fstreamLettura e scrittura su file

Riferimento — <string>

MetodoDescrizioneEsempio
length() / size()Lunghezzas.length()
substr(p, n)Sottostringas.substr(0, 3)
find(t)Posizione di ts.find("ab")
append() / +Concatenas += "x"
replace(p, n, t)Sostituisces.replace(0,2,"X")
at(i) / [i]Carattere all'indice is[0]
empty()Stringa vuota?s.empty()
c_str()Converte in stringa Cs.c_str()
stoi() / to_string()Conversione numero↔stringastoi("42")

Riferimento — <vector>

MetodoDescrizione
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>

FunzioneDescrizione
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:

CertificazioneEnteLivello
CPA — C++ Certified Associate ProgrammerC++ Institute / Pearson VUEBase/Intermedio
CPP — C++ Certified Professional ProgrammerC++ InstituteAvanzato
C++ CertificationW3SchoolsBase

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.

✏️ Provalo tu — leggi e modifica il codice C++
Anteprima