Torna ai corsi
AI013 Professional

Tutorial su C++ Moderno

Questo tutorial ha lo scopo di fornire ai programmatori esperti un riferimento rapido alle nuove funzionalità di C++11/14/17/20. Copre miglioramenti nell'usabilità del linguaggio, ottimizzazioni in fase di esecuzione, nuovi contenitori, puntatori intelligenti e gestione della memoria, espressioni regolari, programmazione concorrente e una preview di C++20.

4.8
30.0h
318 studenti
2 mi piace
Intelligenza Artificiale
Inizia ad imparare

Panoramica del corso

📚 Riepilogo del contenuto

Questo tutorial è stato progettato per fornire agli sviluppatori esperti un riferimento rapido alle nuove funzionalità di C++11/14/17/20. Il contenuto copre miglioramenti nell'usabilità linguistica, ottimizzazioni a runtime, l'utilizzo di nuovi contenitori, puntatori intelligenti e gestione della memoria, espressioni regolari, programmazione concorrente e una preview di C++20.

Fai rapidamente il punto su C++11/14/17/20 e attraversa la porta d'ingresso verso la programmazione moderna in C++.

Autore: 欧长坤 (Ou Changkun)

Ringraziamenti: Rilasciato sotto licenza CC BY-NC-ND 4.0, grazie a tutti i contributori GitHub e alla comunità correlata.

🎯 Obiettivi di apprendimento

  1. Identificare e verificare l'ambiente del compilatore C++ e l'architettura target utilizzando strumenti da riga di comando.
  2. Spiegare la compatibilità standard e la storia sovrapposta tra C (C89, C99, C11) e C++ (C++98, C++1x).
  3. Implementare il collegamento interlingua funzionale usando intestazioni extern "C" e flussi di compilazione a più fasi.
  4. Risolvere l'ambiguità dei puntatori con nullptr e implementare logica a tempo di compilazione con constexpr e if constexpr.
  5. Semplificare dichiarazioni complesse con auto, decltype e alias di tipo (using), garantendo un design orientato agli oggetti robusto con override e final.
  6. Progettare codice altamente generico utilizzando template variadici, espressioni fold e deduzione dei parametri template non tipici.
  7. Definire e implementare espressioni Lambda con diversi modi di cattura (Valore, Riferimento, Espressione e Generico).
  8. Utilizzare std::function e std::bind per creare wrapper funzionali flessibili e applicazioni parziali di funzioni.
  9. Classificare le espressioni in Lvalues, Prvalues e Xvalues, e applicare la semantica di spostamento per ottimizzare la gestione delle risorse della classe.
  10. Distinguere tra i modelli di memoria e i casi d'uso di std::array (dimensione fissa, stack) e std::vector (dimensione dinamica, heap).

🔹 Lezione 1: Evoluzione storica del C++ e ambiente

Panoramica: Questa lezione tratta le basi tecniche dell'ambiente di sviluppo C++ e il suo rapporto storico con il linguaggio C. Illustra come gli standard C++ (da C++98 a C++1x) si sovrappongano agli standard C (da C89 a C11) e fornisce i meccanismi specifici, come extern "C", necessari per compilare e collegare correttamente progetti misti C e C++.

Risultati dell'apprendimento:

  • Identificare e verificare l'ambiente del compilatore C++ e l'architettura target utilizzando strumenti da riga di comando.
  • Spiegare la compatibilità standard e la storia sovrapposta tra C (C89, C99, C11) e C++ (C++98, C++1x).
  • Implementare il collegamento interlingua funzionale usando intestazioni extern "C" e flussi di compilazione a più fasi.

🔹 Lezione 2: Usabilità linguistica: sintassi moderna e template

Panoramica: Questa lezione esplora l'evoluzione del C++ dal C++11 al C++20, concentrando gli sforzi su miglioramenti che aumentano chiarezza del codice, sicurezza dei tipi e flessibilità dei template. Gli studenti padroneggeranno le caratteristiche moderne della sintassi come l'inferenza dei tipi, l'elaborazione a tempo di compilazione con constexpr, e tecniche avanzate di template come i template variadici ed espressioni fold.

Risultati dell'apprendimento:

  • Risolvere l'ambiguità dei puntatori con nullptr e implementare logica a tempo di compilazione con constexpr e if constexpr.
  • Semplificare dichiarazioni complesse con auto, decltype e alias di tipo (using), garantendo un design orientato agli oggetti robusto con override e final.
  • Progettare codice altamente generico utilizzando template variadici, espressioni fold e deduzione dei parametri template non tipici.

🔹 Lezione 3: Miglioramenti a runtime: Lambda e semantica di spostamento

Panoramica: Questa lezione copre miglioramenti critici a runtime introdotti nel C++ moderno (C++11/14), focalizzandosi su costrutti di programmazione funzionale e gestione efficiente delle risorse. Gli studenti padroneggeranno le espressioni Lambda — inclusi i catturatori generici di C++14 e quelli per espressioni — e approfondiranno i meccanismi della semantica di spostamento, delle categorie di valore (Lvalue/Rvalue) e del forwarding perfetto per eliminare copie profonde non necessarie in applicazioni ad alte prestazioni.

Risultati dell'apprendimento:

  • Definire e implementare espressioni Lambda con diversi modi di cattura (Valore, Riferimento, Espressione e Generico).
  • Utilizzare std::function e std::bind per creare wrapper funzionali flessibili e applicazioni parziali di funzioni.
  • Classificare le espressioni in Lvalues, Prvalues e Xvalues, e applicare la semantica di spostamento per ottimizzare la gestione delle risorse della classe.

🔹 Lezione 4: Contenitori moderni: std::array

Panoramica: Questa lezione introduce std::array, un contenitore introdotto con C++11 come alternativa moderna agli array tradizionali in stile C. Esplora i vantaggi di un contenitore di dimensione fissa che incapsula array grezzi, offrendo contemporaneamente un'interfaccia più sicura, compatibile con STL e allocazione di memoria sullo stack.

Risultati dell'apprendimento:

  • Distinguere tra i modelli di memoria e i casi d'uso di std::array (dimensione fissa, stack) e std::vector (dimensione dinamica, heap).
  • Inizializzare e gestire correttamente std::array utilizzando metodi membri come .size() e .empty().
  • Applicare algoritmi della Standard Template Library (STL) e cicli basati su intervallo a oggetti std::array.

🔹 Lezione 5: Puntatori intelligenti e gestione della memoria RAII

Panoramica: Questa lezione introduce il principio fondamentale della gestione della memoria moderna in C++, Resource Acquisition Is Initialization (RAII). Tratta la transizione dalla gestione manuale dei puntatori a una gestione automatizzata tramite std::unique_ptr per proprietà esclusiva, std::shared_ptr per condivisione controllata tramite conteggio di riferimenti, e std::weak_ptr per rompere dipendenze circolari.

Risultati dell'apprendimento:

  • Comprendere e applicare il principio RAII per garantire il rilascio delle risorse quando escono dall'ambito.
  • Implementare modelli di proprietà condivisa ed esclusiva usando std::shared_ptr e std::unique_ptr.
  • Identificare e risolvere perdite di memoria causate da riferimenti circolari usando std::weak_ptr.

🔹 Lezione 6: Espressioni regolari e analisi di stringhe

Panoramica: Questa lezione tratta l'implementazione di espressioni regolari usando la libreria standard C++11 (std::regex) e le loro applicazioni pratiche nell'analisi di richieste HTTP. Gli studenti impareranno la sintassi dei quantificatori regex, l'uso di std::smatch per catturare risultati e l'integrazione architetturale di questi strumenti all'interno di un ambiente server Web basato su template.

Risultati dell'apprendimento:

  • Identificare e applicare caratteri speciali delle espressioni regolari (quantificatori) per definire schemi di stringhe.
  • Utilizzare std::regex e std::smatch per validare nomi di file ed estrarre dati da stringhe.
  • Implementare logica principale del server, inclusa l'analisi di richieste HTTP e la mappatura delle risorse usando modelli di memoria e contenitori moderni in C++.

🔹 Lezione 7: Parallelismo, concorrenza e modelli di memoria

Panoramica: Questa lezione copre il cambiamento fondamentale introdotto da C++11 verso un modello multithreading standardizzato. Passa dalla gestione thread basilare e dal locking basato su RAII ai primitivi di sincronizzazione avanzati come futures e variabili condizione, per concludere con il rigoroso modello di memoria C++11, operazioni atomiche e garanzie di coerenza della memoria.

Risultati dell'apprendimento:

  • Gestire il ciclo di vita dei thread e proteggere risorse condivise usando std::thread, std::mutex e wrapper RAII (std::lock_guard, std::unique_lock).
  • Implementare flussi asincroni e comunicazione tra thread usando std::future, std::packaged_task e std::condition_variable.
  • Applicare tipi std::atomic e selezionare strategie appropriate di std::memory_order per garantire visibilità della memoria e prevenire riordinamenti istruzioni illegali.

🔹 Lezione 8: Libreria standard: aggiornamenti sul filesystem

Panoramica: Questa lezione esplora l'evoluzione della libreria standard C++, concentrandosi sulle funzionalità di alto livello introdotte con C++11 e versioni successive. Evidenzia il passaggio da implementazioni specifiche della piattaforma o a basso livello a strumenti standardizzati di alto livello come std::filesystem e strumenti per la concorrenza.

Risultati dell'apprendimento:

  • Identificare i principali componenti di concorrenza aggiunti alla libreria standard con C++11.
  • Riconoscere std::filesystem come un'importante novità per la gestione moderna di percorsi e file.
  • Comprendere il ruolo delle astrazioni di alto livello nell'innovazione dello sviluppo C++ moderno.

🔹 Lezione 9: Funzionalità moderne varie

Panoramica: Questa lezione copre una selezione di funzionalità impattanti introdotte con C++11 e perfezionate in versioni successive per migliorare sicurezza dei tipi, prestazioni e leggibilità del codice. Gli studenti impareranno il tipo long long int, le specifiche di eccezione con noexcept, stringhe e letterali definiti dall'utente potenziate, e il controllo fine dell'allineamento della memoria tramite alignof e alignas.

Risultati dell'apprendimento:

  • Identificare e implementare il tipo long long int per precisione estesa degli interi.
  • Applicare il modificatore noexcept per ottimizzare il trattamento delle eccezioni e usare l'operatore noexcept per interrogare la sicurezza di una funzione.
  • Utilizzare letterali stringa grezzi per semplificare definizioni complesse di stringhe e creare letterali definiti dall'utente per suffissi personalizzati di tipi.

🔹 Lezione 10: C++20: Il futuro del linguaggio

Panoramica: Questa lezione introduce i "Quattro Grandi" pilastri di C++20: Concepts, Modules, Coroutines e Ranges. Queste funzionalità rappresentano l'evoluzione più significativa del linguaggio dal C++11, con focus su miglioramenti nella sicurezza dei template, efficienza della compilazione, programmazione asincrona e elaborazione dei dati in stile funzionale.

Risultati dell'apprendimento:

  • Identificare e descrivere le quattro funzionalità principali introdotte con lo standard C++20.
  • Spiegare il ruolo di Concepts e Constraints nel migliorare il trattamento degli errori nei template e nel design.
  • Distinguere tra l'approccio tradizionale basato su header e il nuovo sistema Modules.