Obiettivi formativi
Con riferimento agli indicatori di Dublino:
Conoscenza e capacità di comprensione
La programmazione orientata agli oggetti si fonda su alcuni principi (incapsulamento, ereditarietà, polimorfismo, ecc.) che l'esperienza ha mostrato essere fondamentali per lo sviluppo di software chiaro, conciso, riutilizzabile e di facile manutenzione. I linguaggi di programmazione più diffusi rendono disponibili alcuni strumenti e tecniche che portano allo sviluppo di codice aderente ai principi suddetti. Il corso si propone di presentare le caratteristiche avanzate del linguaggio di programmazione C++, mostrando come un loro utilizzo corretto e consapevole porti al raggiungimento degli obiettivi preposti.
Capacità di applicare conoscenza e comprensione
Per ognuno dei concetti presentati è presentato un esempio minimale di applicazione, così da metterne in evidenza le caratteristiche essenziali.
Autonomia di giudizio
Lo studio di soluzioni alternative per lo stesso problema consentirà allo studente di valutarne pregi e difetti, evidenziando con spirito critico i contesti nei quali una particolare soluzione è preferibile alle altre.
Capacità di apprendimento
Lo studio e l'applicazione delle principali tecniche di programmazione su esempi semplici è propedeutico alla loro successiva applicazione in contesti più articolati, nei quali è necessario valutare l'interazione tra le varie componenti del sistema progettato.
Prerequisiti
Si assume la conoscenza del frammento imperativo del linguaggio C++.
Contenuti dell'insegnamento
Richiami sul linguaggio C++: tipi di dato; espressioni; istruzioni; funzioni; campo d'azione e ciclo di vita; funzioni sovraccaricate; classi.
Introduzione ai costrutti dello standard ISO C++ 2011.
Programmazione per contratto: pre-condizioni, post-condizioni ed invarianti di classe.
Inizializzazione, assegnamento e distruzione; copia e spostamento.
Eccezioni e gestione delle risorse; tecniche per la gestione dinamica della memoria.
Ereditarietà semplice: differenze tra contenimento, ereditarietà privata ed ereditarietà pubblica.
Polimorfismo dinamico: funzioni virtuali; il principio di sostituzione di Liskov.
Progetto di interfacce software: tipi concreti, tipi astratti, classi di interfaccia e classi implementative; ereditarietà multipla e virtuale.
Polimorfismo statico: template di funzione e template di classe.
La libreria standard STL: contenitori, iteratori ed algoritmi generici; oggetti funzione.
Ambiente di sviluppo: il compilatore g++; il debugger gdb; automazione del processo di compilazione: make; controllo delle versioni: cvs e git.
Documentazione di interfacce software: doxygen.
Programma esteso
- - -
Bibliografia
B. Stroustrup.
C++: Linguaggio, libreria standard, principi di programmazione,
quarta edizione, Pearson, 2015.
S. Lippman, J. Lajoie.
C++: Corso di programmazione,
terza edizione, Addison-Wesley, 2000.
B. Eckel.
Thinking in C++, Volumes 1 and 2,
seconda edizione, 2003.
Metodi didattici
Lezioni frontali ed esercitazioni.
Modalità verifica apprendimento
Esame scritto ed orale.
Altre informazioni
- - -
Obiettivi agenda 2030 per lo sviluppo sostenibile
- - -