Perché C++?
Il C++ è un linguaggio compilato: il codice che scrivi viene tradotto in istruzioni macchina prima dell'esecuzione, senza intermediari. Questo lo rende veloce ed efficiente, adatto a sistemi operativi, videogiochi, software embedded e applicazioni dove le prestazioni contano.
È anche un linguaggio fortemente tipizzato: ogni variabile ha un tipo dichiarato esplicitamente, e il compilatore segnala subito gli errori di tipo. Questo apparente vincolo è in realtà un aiuto: molti bug vengono eliminati prima ancora di eseguire il programma.
Infine, il C++ è vicino all'hardware: permette di gestire la memoria direttamente, capire come i dati sono rappresentati in byte e ragionare su indirizzi e puntatori. È per questo che è il linguaggio di riferimento per chi studia informatica a livello tecnico.
Dal sorgente all'eseguibile
Scrivere un programma in C++ richiede tre passaggi distinti. È fondamentale capirli perché gli errori che incontrerai appartengono a fasi diverse e si risolvono in modo diverso.
scritto da te
g++ traducein linguaggio macchina
pronto per girare
Errori di collegamento (linker) — il codice è sintatticamente corretto ma mancano pezzi (funzione dichiarata ma non definita).
Errori di runtime — il programma gira ma si comporta in modo errato o va in crash (divisione per zero, accesso fuori dai limiti di un array).
Compilazione da terminale
Tutti gli ambienti di sviluppo usano internamente un compilatore. Il più comune è g++, parte del pacchetto GCC. Da terminale:
# compila hello.cpp e produce l'eseguibile "hello" g++ hello.cpp -o hello # esegui il programma ./hello # Linux / macOS hello.exe # Windows
Nei laboratori scolastici questo passaggio è di solito gestito dall'IDE con un tasto “Run” o “Esegui” — ma sotto al tasto c'è sempre g++ (o un compilatore equivalente) che gira.
Gestione I/O
Ogni programma utile legge dati in ingresso e produce risultati in uscita. In C++ questo avviene tramite gli stream: cout per l'output a schermo e cin per l'input da tastiera, entrambi definiti in <iostream>.
#include <iostream> // include la libreria standard di I/O: senza questa, cout non esiste using namespace std; // evita di scrivere "std::cout" ogni volta: basta "cout" int main() { // PUNTO DI INGRESSO del programma: l'esecuzione inizia sempre qui cout << "Hello, World!" << endl; // stampa a schermo + vai a capo return 0; // restituisce 0 al sistema operativo: 0 = tutto ok } // chiude il blocco main
I tre elementi fissi di ogni programma C++
#include — in cima al file, indicano al compilatore quali librerie usare. <iostream> per I/O, <string> per le stringhe, <fstream> per i file.2.
using namespace std; — permette di usare i nomi standard (cout, cin, string...) senza il prefisso std::. Non è obbligatorio ma è quasi universale in ambito didattico.3.
int main() — funzione obbligatoria e unica: il programma parte da qui e termina quando questa funzione restituisce. return 0 segnala al sistema operativo che l'esecuzione è terminata senza errori.
Output — cout
Il primo esempio classico: stampare un messaggio a schermo. Ogni riga di questo snippet è commentata perché la struttura che vedi qui si ripete in ogni programma C++ che scriverai.
cout << "Testo"; // stampa testo, cursore rimane sulla stessa riga cout << "Testo" << endl; // stampa testo + vai a capo (endl = end line) cout << "Testo\n"; // equivalente: \n è il carattere di fine riga // concatenazione con << cout << "Nome: " << "Mario" << " Rossi" << endl;
cin — leggere l'input da tastiera
cin legge ciò che l'utente digita. L'operatore >> è il contrario di <<: invece di mandare dati allo schermo, li preleva dalla tastiera e li mette in una variabile.
#include <iostream> #include <string> // necessario per usare il tipo string using namespace std; int main() { string nome; // dichiaro una variabile di tipo string cout << "Come ti chiami? "; // chiedo l'input (senza endl: cursore rimane in riga) cin >> nome; // leggo la risposta e la salvo in nome cout << "Ciao, " << nome << "!" << endl; // uso la variabile return 0; }
cin >> nome legge solo Mario — si ferma al primo spazio. Per leggere una riga intera (nome e cognome) si usa getline():
#include <iostream> #include <string> using namespace std; int main() { string nomeCompleto; cout << "Nome e cognome: "; getline(cin, nomeCompleto); // legge l'intera riga inclusi gli spazi cout << "Benvenuto, " << nomeCompleto << "!" << endl; return 0; }
Ambienti di sviluppo
Puoi scrivere C++ con qualsiasi editor di testo, ma un ambiente di sviluppo (IDE) integra in un'unica interfaccia i tre strumenti fondamentali:
- Editor — con evidenziazione della sintassi, completamento automatico e indicazione degli errori mentre scrivi
- Compilatore — invocato con un tasto, traduce il sorgente in eseguibile e mostra gli errori di compilazione
- Debugger — permette di eseguire il programma passo per passo, ispezionare le variabili e trovare la causa di un errore logico
La scelta dell'IDE non cambia il linguaggio: il C++ che scrivi è lo stesso ovunque.
Errori comuni del primo giorno
I primi errori di compilazione che si incontrano sono quasi sempre gli stessi. Riconoscerli subito fa risparmiare molto tempo.
; — il compilatore segnala l'errore sulla riga successiva, non su quella mancante.; termina l'istruzione. Senza, il compilatore considera le due righe un'unica istruzione incompleta.Cout non esiste: è cout. Int non esiste: è int.cout è definito in <iostream>. Senza l'include il compilatore non sa cos'è cout.#include vanno sempre all'inizio del file, prima di tutto il resto.Il formato tipico è: nomefile.cpp: riga:colonna: error: descrizione.
Leggi sempre il primo errore della lista — spesso gli errori successivi sono conseguenze di quello iniziale e spariscono non appena lo risolvi.