C++ Primer, Quinta Edizione
Una guida completa e autorevole su C++, completamente riscritta per lo standard C++11. Questo corso copre tutto, dagli elementi di base del linguaggio alle complesse funzionalità della libreria e agli strumenti avanzati per la creazione di classi.
Panoramica del corso
📚 Riepilogo del contenuto
Una guida completa e autorevole su C++, completamente riscritta per lo standard C++11. Questo corso copre tutto, dalle basi degli elementi linguistici alle funzionalità avanzate della libreria e agli strumenti per la creazione di classi complesse.
La guida definitiva e di riferimento industriale per padroneggiare la programmazione moderna in C++11.
Autore: Stanley B. Lippman, Josée Lajoie, Barbara E. Moo
Ringraziamenti: Dave Abrahams, Andy Koenig, Stephan T. Lavavej, Jason Merrill, John Spicer, Herb Sutter, Bjarne Stroustrup, Alex Stepanov, e membri del comitato di standardizzazione.
🎯 Obiettivi didattici
- Definire e implementare la funzione
maine comprendere il suo interagire con il sistema operativo. - Eseguire la compilazione da riga di comando e gestire i flussi di I/O di base (
cin,cout). - Applicare istruzioni di controllo del flusso per risolvere problemi logici iterativi, come contare le occorrenze.
- Implementare strutture logiche per contare e elaborare occorrenze consecutive di dati in input.
- Distinguere tra l'operatore di assegnazione (
=) e quello di uguaglianza (==) all'interno delle istruzioni di controllo. - Usare oggetti di classe (
Sales_item), accedere alle funzioni membro tramite l'operatore punto e includere file di intestazione personalizzati. - Distinguere tra tipi primitivi diversi e prevedere i risultati delle conversioni di tipo e dei ripiegamenti aritmetici senza segno.
- Implementare funzionalità C++11 come inizializzazione con liste,
nullptr,constexpre specificatori di deduzione del tipo. - Distinguere tra dichiarazioni e definizioni di variabili e applicare le regole di ambito per gestire la visibilità degli identificatori.
- Distinguere tra riferimenti e puntatori e utilizzare
void*per gestire in modo generico la memoria.
🔹 Lezione 1: Introduzione a C++ e I/O di base
Panoramica: Questa lezione introduce la struttura fondamentale di un programma C++, concentrandosi sulla funzione main, sui tipi di dato di base e sul processo di compilazione. Copre operazioni fondamentali di Input/Output (I/O) usando la libreria iostream, l’implementazione della logica tramite cicli while e for, e conclude con un’introduzione ai concetti orientati agli oggetti tramite la classe Sales_item.
Risultati dell'apprendimento:
- Definire e implementare la funzione
maine comprendere il suo interagire con il sistema operativo. - Eseguire la compilazione da riga di comando e gestire i flussi di I/O di base (
cin,cout). - Applicare istruzioni di controllo del flusso per risolvere problemi logici iterativi, come contare le occorrenze.
🔹 Lezione 2: Flusso di controllo e concetti di base sulle classi
Panoramica: Questa lezione passa dal flusso di controllo di base al potere fondamentale del C++: le classi. Gli studenti acquisiranno la logica necessaria per elaborare flussi di dati (contare occorrenze consecutive) e impareranno a usare la classe Sales_item per gestire strutture dati complesse tanto facilmente quanto i tipi integrati. L'unità si conclude con l'implementazione di un programma funzionale per un negozio di libri, integrando il reindirizzamento dei file e la segnalazione di errori.
Risultati dell'apprendimento:
- Implementare strutture logiche per contare e elaborare occorrenze consecutive di dati in input.
- Distinguere tra l'operatore di assegnazione (
=) e quello di uguaglianza (==) all'interno delle istruzioni di controllo. - Usare oggetti di classe (
Sales_item), accedere alle funzioni membro tramite l'operatore punto e includere file di intestazione personalizzati.
🔹 Lezione 3: Tipi primitivi e variabili
Panoramica: Questa lezione stabilisce i blocchi fondamentali della programmazione C++ esplorando i tipi aritmetici, il ciclo di vita delle variabili e il modello di memoria. Gli studenti padroneggeranno le sfumature delle conversioni di tipo (soprattutto per i tipi senza segno), la sintassi C++11 per l'inizializzazione con liste e le distinzioni critiche tra puntatori e riferimenti. La lezione conclude con sistemi di tipo avanzati, inclusi i qualificatori const, la deduzione di tipo (auto, decltype) e la realizzazione di strutture dati personalizzate robuste usando guardie preprocessor.
Risultati dell'apprendimento:
- Distinguere tra diversi tipi primitivi e prevedere i risultati delle conversioni di tipo e dei ripiegamenti aritmetici senza segno.
- Implementare funzionalità C++11 come inizializzazione con liste,
nullptr,constexpre specificatori di deduzione del tipo. - Distinguere tra dichiarazioni e definizioni di variabili e applicare le regole di ambito per gestire la visibilità degli identificatori.
🔹 Lezione 4: Tipi composti e qualificatori di tipo moderni
Panoramica: Questa lezione esplora il sofisticato sistema di tipi del C++11, concentrandosi su come i tipi composti (puntatori e riferimenti) interagiscono con qualificatori di tipo come const e constexpr. Gli studenti padroneggeranno le sfumature della deduzione di tipo usando auto e decltype, e impareranno a incapsulare dati all'interno di strutture personalizzate protette da guardie di intestazione preprocessor.
Risultati dell'apprendimento:
- Distinguere tra riferimenti e puntatori e utilizzare
void*per la gestione generica della memoria. - Categorizzare e applicare qualificazioni
constdi livello superiore e inferiore econstexprper costanti di tempo di compilazione. - Implementare la deduzione di tipo C++11 (
autoedecltype) per scrivere codice flessibile e mantenibile.
🔹 Lezione 5: Stringhe e vettori della libreria
Panoramica: Questa lezione copre i tipi fondamentali della libreria standard C++ string e vector, che offrono alternative più flessibili e sicure rispetto ai tipi incorporati. Gli studenti impareranno a gestire l'accesso agli spazi dei nomi tramite dichiarazioni using, inizializzare e manipolare stringhe e contenitori di lunghezza variabile, e usare cicli for basati su intervallo e iteratori per elaborare collezioni di dati in modo efficiente.
Risultati dell'apprendimento:
- Semplificare il codice usando dichiarazioni
usingper gli spazi dei nomi, evitando errori comuni nei file di intestazione. - Eseguire un'inizializzazione robusta di stringhe e vettori, incluso l'inizializzazione con liste C++11.
- Implementare elaborazione a livello di carattere e crescita dinamica dei contenitori usando
push_back, cicliforbasati su intervallo e operazioni di base sugli iteratori.
🔹 Lezione 6: Iteratori e array predefiniti
Panoramica: Questa lezione copre i meccanismi fondamentali per navigare e gestire sequenze nel C++11. Passa da strumenti moderni ad alto livello come gli iteratori per string e vector a array predefiniti a basso livello, aritmetica dei puntatori e stringhe di stile C. Gli studenti impareranno a interfacciare codice legacy basato su array con container della libreria standard moderna e a gestire strutture multidimensionali complesse.
Risultati dell'apprendimento:
- Usare iteratori e aritmetica degli iteratori per navigare e manipolare contenitori
stringevector. - Definire, inizializzare e navigare array predefiniti usando aritmetica dei puntatori e le funzioni biblioteca
begin/end. - Implementare operazioni su stringhe di stile C e interfacciare in modo sicuro array predefiniti con tipi della libreria moderna.
🔹 Lezione 7: Espressioni, operatori e conversioni
Panoramica: Questa lezione copre i blocchi fondamentali delle espressioni C++, concentrando l'attenzione su come il linguaggio valuta le operazioni e gestisce i tipi di dati. Gli studenti padroneggeranno la differenza tra lvalue e rvalue, le regole di precedenza e associatività degli operatori, e i meccanismi delle operazioni aritmetiche, logiche e bitwise. Inoltre, la lezione offre un'approfondita analisi della gestione dei tipi in C++, inclusa la conversione aritmetica implicita e l’applicazione sicura di casting espliciti denominati.
Risultati dell'apprendimento:
- Distinguere tra lvalue (identità dell'oggetto) e rvalue (valore dell'oggetto) e comprendere il loro ruolo nelle espressioni.
- Prevedere l'ordine di valutazione di espressioni complesse usando precedenza, associatività e logica di cortocircuito.
- Eseguire manipolazioni dati a basso livello usando operatori bitwise e gestire la sicurezza dei tipi tramite conversioni implicite e casting espliciti denominati.
🔹 Lezione 8: Istruzioni avanzate e gestione delle eccezioni
Panoramica: Questa lezione copre le strutture fondamentali di flusso di controllo C++, che vanno dalle semplici tipologie di istruzioni e regole di scoping alle logiche condizionali e iterative avanzate. Introduce anche tecniche robuste di gestione degli errori usando meccanismi di gestione delle eccezioni C++ e l’ereditarietà gerarchica delle eccezioni della libreria standard.
Risultati dell'apprendimento:
- Distinguere tra istruzioni nulle, semplici e composte e gestire l’ambito delle variabili all’interno di queste strutture.
- Implementare decisioni complesse usando istruzioni
ifeswitch, risolvendo errori logici come il "dangling else". - Selezionare e applicare il costrutto iterativo appropriato (
while,for, rangefor,do while) per compiti specifici di programmazione.
🔹 Lezione 9: Progettazione di funzioni e passaggio di argomenti
Panoramica: Questa lezione copre l’architettura delle funzioni C++, concentrandosi su come i dati vengono passati dentro e restituiti da blocchi di codice modulare. Esplora il ciclo di vita degli oggetti locali, i meccanismi del passaggio di argomenti (per valore vs. per riferimento) e lo standard C++11 per gestire parametri variabili. La padronanza di questi concetti permette agli sviluppatori di scrivere codice efficiente, riutilizzabile e sicuro dal punto di vista della memoria.
Risultati dell'apprendimento:
- Distinguere tra metodi di inizializzazione dei parametri e il loro impatto su prestazioni e integrità dei dati.
- Implementare interfacce di funzioni robuste usando qualificatori
const,initializer_liste tecniche di passaggio di array. - Gestire efficacemente il ciclo di vita degli oggetti usando durata di memorizzazione automatica e statica.
🔹 Lezione 10: Funzionalità avanzate e sovraccarico
Panoramica: Questa lezione copre i meccanismi intricati delle funzioni C++, concentrandosi sul passaggio di parametri, sul ciclo di vita degli oggetti e sulla complessità del sovraccarico delle funzioni. Gli studenti padroneggeranno funzionalità C++11 come initializer_list per parametri variabili, funzioni constexpr e la dichiarazione e l’uso di puntatori a funzione per creare codice flessibile e modulare.
Risultati dell'apprendimento:
- Distinguere tra passaggio per valore e passaggio per riferimento e identificare quando usare parametri
const. - Applicare le regole di risoluzione del sovraccarico per determinare la "migliore corrispondenza" tra funzioni candidate e valide.
- Implementare e gestire puntatori a funzione, inclusa la loro utilizzo in container come vettori e come tipi di ritorno.
🔹 Lezione 11: Incapsulamento di classi e costruttori
Panoramica: Questa lezione copre il passaggio da strutture dati semplici a tipi astratti di dati (ADT) in C++. Si concentra sui meccanismi di progettazione delle classi, inclusi funzioni membro, il puntatore implicito this e il ruolo critico dei costruttori nell’inizializzazione degli oggetti. Inoltre, esplora l’incapsulamento tramite controllo di accesso (public/private) e l’uso di "friend" per mantenere un’interfaccia pulita nascondendo dettagli implementativi.
Risultati dell'apprendimento:
- Progettare e implementare una classe C++ (come
Sales_data) che separa l’interfaccia dall’implementazione. - Padronizzare le regole di inizializzazione degli oggetti usando costruttori predefiniti, sovraccaricati ed espliciti.
- Applicare qualificatori di accesso e amicizia per garantire l’incapsulamento e gestire lo scope della classe.
🔹 Lezione 12: Ambito delle classi e gestione delle conversioni
Panoramica: Questa lezione copre i meccanismi avanzati di progettazione delle classi C++, concentrandosi sul passaggio da strutture dati semplici a tipi astratti di dati (ADT) robusti. Argomenti chiave includono la gestione dell’inizializzazione degli oggetti tramite diversi tipi di costruttori, il controllo delle conversioni di tipo implicita usando la parola chiave explicit e la comprensione di entità a livello di classe come membri static e classi letterali.
Risultati dell'apprendimento:
- Progettare e implementare classi incapsulate (ADT) usando qualificatori di accesso e dichiarazioni friend.
- Gestire le conversioni di tipo di classe implicita e sopprimerle usando la parola chiave
explicit. - Implementare e inizializzare membri
staticdi classe per la gestione dei dati a livello di classe.
🔹 Lezione 13: I/O con stream e concetti base dei contenitori sequenziali
Panoramica: Questa lezione copre i meccanismi fondamentali del sistema di I/O della libreria standard C++ e dei contenitori sequenziali. Gli studenti impareranno a gestire gli stati delle condizioni di stream e i buffer di output, eseguire I/O su file e stringhe e navigare i contenitori della libreria. La lezione enfatizza concetti cruciali come gli intervalli di iteratori, l’inizializzazione dei contenitori e le implicazioni prestazionali della gestione della memoria dei contenitori.
Risultati dell'apprendimento:
- Interrogare e resettare gli stati delle condizioni di stream e controllare lo scarico del buffer di output per gestire l’integrità dello stream.
- Utilizzare
fstreamesstreamper gestire dati persistenti e in memoria usando vari modi di file. - Scegliere contenitori sequenziali appropriati in base ai pattern di accesso e al sovraccarico di memoria per ottimizzare la selezione.
🔹 Lezione 14: Operazioni sui contenitori e algoritmi generici
Panoramica: Questa lezione copre la gestione dei contenitori sequenziali C++ e l’applicazione di algoritmi generici per elaborare dati indipendentemente dai tipi di contenitore. Esplora come i contenitori gestiscono la crescita della memoria e il ciclo di vita degli elementi, insieme all’uso di lambda e binders di funzioni per personalizzare gli algoritmi della libreria. Gli studenti padroneggeranno l’architettura della libreria, inclusi i tipi di iteratori e algoritmi specializzati.
Risultati dell'apprendimento:
- Gestire i cicli di vita dei contenitori usando operazioni specializzate per
forward_list, tecniche di ridimensionamento e gestione della capacità divector. - Eseguire manipolazioni complesse di stringhe e conversioni numeriche usando la libreria estesa
stringe adaptor di contenitori. - Implementare algoritmi generici per leggere, scrivere e riordinare dati personalizzando il comportamento tramite predicati, espressioni lambda e
std::bind.
🔹 Lezione 15: Contenitori associativi e puntatori intelligenti
Panoramica: Questa lezione copre lo standard C++11 per contenitori associativi e la gestione della memoria dinamica. Dettaglia l’uso di contenitori ordinati e non ordinati per recuperi efficienti basati su chiavi e l’implementazione di codice robusto e sicuro in caso di eccezioni usando puntatori intelligenti. La lezione conclude con la progettazione di un’applicazione reale di query testuale che integra queste strutture dati complesse.
Risultati dell'apprendimento:
- Implementare e manipolare contenitori associativi usando tecniche efficienti di ricerca, inserimento e indicizzazione.
- Padronizzare la gestione della memoria dinamica passando da
new/deletemanuale a puntatori intelligenti basati su RAII e alla classeallocator. - Progettare sistemi complessi che condividano dati in modo sicuro tra classi usando conteggio di riferimenti e proprietà di possesso dei puntatori intelligenti.
🔹 Lezione 16: Gestione delle risorse e semantica di movimento
Panoramica: Questa lezione esplora come le classi C++ controllano il ciclo di vita delle loro risorse tramite le cinque funzioni speciali "Big Five". Gli studenti impareranno a gestire la memoria dinamica usando strategie simili a valori o a puntatori, implementare l’idioma copia-e-scambio sicuro in caso di eccezioni e ottimizzare le prestazioni usando la semantica di movimento C++11 e i riferimenti a valori temporanei.
Risultati dell'apprendimento:
- Implementare e spiegare la Regola dei Tre/Cinque per garantire una gestione corretta delle risorse e prevenire perdite di memoria.
- Distinguere tra comportamenti di classe simili a valori e simili a puntatori e implementare il conteggio di riferimenti.
- Applicare la semantica di movimento usando riferimenti a valori temporanei e
std::moveper eliminare copie profonde non necessarie di oggetti grandi.
🔹 Lezione 17: Sovraccarico degli operatori e ereditarietà (OOP)
Panoramica: Questa lezione esplora l’estensione della sintassi del linguaggio tramite il sovraccarico degli operatori e la costruzione di sistemi estensibili tramite Programmazione Orientata agli Oggetti (OOP). Gli studenti impareranno a progettare classi che si integrino con operazioni incorporate mentre padroneggiano i meccanismi dell’ereditarietà, del binding dinamico e delle gerarchie polimorfiche di classi.
Risultati dell'apprendimento:
- Progettare e implementare operatori sovraccaricati che seguano le convenzioni della libreria standard C++.
- Creare e utilizzare oggetti funzione e il wrapper tipo
functionper unificare entità chiamabili. - Costruire gerarchie di ereditarietà robuste usando funzioni virtuali, classi astratte e qualificatori di accesso C++11.
🔹 Lezione 18: Template e programmazione generica
Panoramica: Questa lezione copre i meccanismi fondamentali e avanzati dei template C++, fornendo la base per la programmazione generica. Gli studenti passeranno dalla definizione di template di funzione e classe di base al dominio avanzato delle funzionalità C++11 come template variadici, forwarding perfetto e specializzazione di template.
Risultati dell'apprendimento:
- Definire e istanziare template di funzione e classe usando sia parametri di tipo che non di tipo.
- Gestire il modello di compilazione dei template e controllare l’istanziazione su più file usando
extern template. - Implementare tecniche avanzate di deduzione, incluse le return type trascinate e il forwarding perfetto con
std::forward.
🔹 Lezione 19: Strumenti avanzati della libreria e sistemi complessi
Panoramica: Questa lezione copre componenti avanzati della libreria standard C++11 e funzionalità linguistiche progettate per lo sviluppo di sistemi complessi. Copre strutture dati specializzate, corrispondenza di modelli robusta tramite la libreria regex, e strumenti architetturali per programmi su larga scala. Inoltre esplora la gestione avanzata delle eccezioni, la gestione degli spazi dei nomi e le complessità dell’ereditarietà multipla.
Risultati dell'apprendimento:
- Utilizzare
tupleper valori di ritorno multipli ebitsetper la gestione efficiente di flag a livello di bit. - Implementare corrispondenza di modelli complessa, validazione e trasformazione di stringhe usando la libreria
regex. - Generare numeri casuali di alta qualità usando engine e distribuzioni, mantenendo uno stato e un seeding corretti.