Conclusioni
La programmazione modulare, la programmazione a oggetti e la programmazione generica forniscono strumenti formidabili per scrivere codice ad alto livello. La possibilità di suddivere un programma in porzioni (quasi) indipendenti rende l'attività dei programmatori più facile, piacevole ed efficace e rende il programma stesso più flessibile, riutilizzabile, estendibile e di più facile manutenzione.
Fra tutti i linguaggi, il C++ è quello che maggiormente permette di realizzare questi obiettivi, grazie ai suoi potenti strumenti concettuali: data hiding, namespace, classe, overload di funzioni e di operatori, eredità, polimorfismo e template. Tuttavia, a differenza da altri linguaggi "puri" di programmazione orientata a oggetti, il C++ non "rinnega" la "cultura" del C, da cui eredita intatta la potenza e verso cui mantiene la compatibilità, preservando un "patrimonio" di conoscenze e realizzazioni che non sarebbe stato conveniente disperdere.
Pertanto il C++ è un linguaggio insieme completo e in continua evoluzione: sul solido impianto del C ha costruito una nuova "filosofia" che gli permette di espandersi nel tempo. A tutt'oggi il C++ si utilizza praticamente in qualsiasi dominio applicativo, inclusi quelli (a noi vicini) dell'insegnamento e della ricerca.
Terminiamo questo corso con una serie di consigli utili per un programmatore C++ non ancora "esperto":
usa "poco" la direttiva #define; al suo posto usa:
const e enum, per definire valori costanti;
inline, per evitare la perdita di efficienza dovuta alle chiamate di funzioni;
template, per specificare famiglie di funzioni o di tipi;
namespace, per evitare conflitti nei nomi.
non dichiarare una variabile locale molto prima di usarla; una dichiarazione può apparire ovunque possa apparire un'istruzione
non definire mai variabili globali; le variabili non locali siano sempre definite in un namespace
evita le copie inutili: passa il più possibile gli argomenti per riferimento; se non vuoi che gli argomenti vengano modificati, dichiarali const
dimentica le funzioni del C di gestione della memoria dinamica (malloc, free e compagnia) e al loro posto usa gli operatori new e delete; per riallocare memoria, non usare la realloc del C, ma i metodi resize o reserve di vector
suddividi il tuo programma in moduli indipendenti, usando i namespace; se sei coinvolto in un grosso progetto, potrai sviluppare il software in modo più efficiente
ragguppa il più possibile variabili e funzioni in classi, e usa gli oggetti, istanze delle classi
gli oggetti sono componenti attive, con proprietà e metodi; realizza il data hiding, rendendo in generale private tutte le proprietà e pubblici solo i metodi che vengono chiamati dall'esterno
se una funzione agisce su un oggetto di una classe, rendila metodo di quella classe; se non è possibile, dichiarala friend (solo però se accede a membri privati)
sfrutta l'overload degli operatori per definire operazioni fra gli oggetti
associa costruttori e distruttori alle classi che definisci
non ricominciare sempre "da zero": usa l'eredità quando vuoi espandere un concetto, e la composizione quando vuoi riunire concetti esistenti
struttura la tua gerarchia di classi applicando il polimorfismo: potrai aggiungere nuove classi senza modificare il codice esistente; non dimenticare di dichiarare virtual il distruttore della classe base
usa i template quando devi progettare una funzione o una classe da applicare a tipi diversi di oggetti
minimizza l'uso degli array e delle stringhe del C; la Libreria Standard del C++ mette a disposizione le classi vector e string, che sono più versatili e più efficienti; in generale, non tentare di costruire da solo quello che è già fornito dalla Libreria (difficilmente potresti raggiungere il suo livello di ottimizzazione)
la Standard Template Library fornisce un insieme di classi (contenitori) e funzioni (algoritmi) che, in quanto template, si possono applicare a una gamma molto vasta di problemi applicativi: non farti mai sfuggire l'occasione di utilizzarla!
evita le funzioni di I/O del C; usa le classi di flusso e i relativi operatori: sono più facili, più eleganti e possono avere overload