Capitolo 1: Introduzione agli Oggetti. Quando i progetti divennero troppo grossi e
complicati per essere facilmente mantenuti, nacque la "crisi del software", con i programmatori che
dicevano: "Non possiamo finire i progetti, sono troppo costosi!". Ciò provocò molte reazioni, le quali
sono discusse in questo capitolo insieme alle idee di programmazione orientata agli oggetti (OOP) e
come cercare di risolvere la crisi del software.
Capitolo2: Creare ed usare gli oggetti. Questo capitolo spiega il processo di costruzione dei
programmi usando i compilatori e le librerie. Introduce il primo programma C++ del libro e mostra
come i programmi sono costruiti e compilati. Poi vengono introdotte alcune librerie base di oggetti
dello Standard C++. Alla fine della lettura di questo capitolo si avrà una buona comprensione di ciò
che significa scrivere un programma C++ usando librerie di oggetti già pronte.
Capitolo 3: Il C nel C++. Questo capitolo è una fitta panoramica di caratteristiche del C che sono
usate nel C++, così come alcune caratteristiche base che sono disponibili solo in C++. Introduce anche
l’utility "make" che è comune nel mondo dello sviluppo del software e che è usata per costruire tutti gli
esempi in questo libro ( il sorgente per il libro, che è disponibile a www.BruceEckel.com, contiene i
makefile per ogni capitolo). Nel Capitolo 3 si assume che si abbiano solide nozioni in qualche
linguaggio di programmazione procedurale tipo Pascal, C o persino anche qualche infarinatura di
Basic ( sempre che si abbia scritto molto codice in quel linguaggio, specialmente funzioni). Se si trova
questo capitolo un po’ troppo avanzato, si dovrebbe leggere il seminario Thinking in C presente sul CD
che è allegato a questo libro ( e anche disponibile sul sito www.BruceEckel.com).
Capitolo 4: astrazione dei dati. La maggior parte delle caratteristiche nel C++ girano intorno
alla capacità di creare nuovi tipi di dato. Ciò non solo fornisce un’organizzazione superiore del codice,
ma getta le basi per più potenti capacità OOP. Si vedrà come questa idea è facilitata dal semplice atto
di mettere le funzioni dentro le strutture, i dettagli di come farlo e che tipo di codice crea. Si imparerà
anche il miglior modo di organizzare il codice in header file e in file di implementazione.
Capitolo 5: nascondere l’implementazione. Si può decidere che alcuni dati e funzioni nella
nostra struttura non sono disponibili all’utente del nuovo tipo rendendoli private. Ciò significa che si
può separare l’implementazione dall’interfaccia che il programmatore client vede e così permettere
che l’implementazione possa essere facilmente cambiata senza influenzare il codice del cliente. Viene
introdotta anche la parola riservata class come un modo più fantasioso di descrivere un nuovo tipo di
dato ed il significato della parola "oggetto" è demistificata ( è una variabile particolare)
Capitolo 6: Inizializzazione e pulizia. Uno degli errori più comuni del C è la non
inizializzazione delle variabili. Il costruttore in C++ ci permette di garantire che le variabili del
nostronuovo tipo ("oggetti delle proprie classi") saranno sempre inizializzate correttamente. Se i
propri oggetti richiederanno anche una specie di pulizia, si può garantire che essa avverrà sempre con
il distruttore del C++.
Capitolo 7: Overloading delle funzioni e argomenti di default. Il C++ è stato pensato
per costruire progetti grossi e complessi, si possono utilizzare più librerie che usano gli stessi nomi di
funzione e si può scegliere anche di usare lo stesso nome con significati diversi in una singolo
funzione. Il C++ rende facile ciò con l'overloading ( sovraccaricamento) della funzione, che permette
di riutilizzare lo stesso nome della funzione ma con la lista degli argomenti diversa.
Capitolo 8: costanti. Questo capitolo copre le parole chiave const e volatile , che hanno un
significato aggiuntivo in C++, specialmente dentro le classi. Si imparerà che cosa significa applicare
const ad una definizione di un puntatore. Il capitolo mostra anche come il significato di const varia
quando usato dentro e fuori le classi e come creare costanti a tempo di compilazione dentro le classi.
Capitolo 9: Funzioni inline. Le macro del preprocessore eliminano l’overhead di chiamate di
funzioni, ma il preprocessore elimina anche il prezioso controllo sul tipo del C++. Le funzioni inline
danno tutti i benefici di un preprocessore delle macro più tutti i benefici di una reale chiamata di
funzione. Questo capitolo esplora completamente l’implementazione e l’uso delle funzione inline.
Capitolo 10: controllo dei nomi. Creare nomi è un’attività fondamentale nella
programmazione e quando i progetti diventano grandi, il numero di nomi può essere enorme. Il C++
permette un grande controllo sui nome in termini di creazione, visibilità, disposizione della memoria e
connessione. Questo capitolo mostra come i nomi vengono controllati in C++ usando due tecniche.
Per primo, la parola riservata static è usata per controllare la visibilità ed i linkage e viene esplorato il
suo speciale significato con le classi. Una tecnica di gran lunga più utile per il controllo dei nomi nella
visibilità globale è la caratteristica del C++ namespace, che permette di dividere lo spazio globale dei
nomi in regioni distinte.
Capitolo 11: riferimento e costruttore di copia. I puntatori del C++ funzionano come i
puntatori del C con in più il beneficio di un più forte controllo del tipo del C++. Il C++ fornisce anche
un modo addizionale per gestire gli indirizzi: dall ‘Algol e Pascal, il C++ prende il riferimento, che
permette al compilatore di gestire la manipolazione degli indirizzi mentre si utilizza la normale
notazione. Si incontrerà anche il costruttore di copia, che controlla il modo in cui gli oggetti sono
passati in ingresso ed uscita alle funzione per valore. Alla fine viene spiegato il puntatore a membro
del C++.
Capitolo 12: sovraccaricamento degli operatori. Questa caratteristica è a volte detta
"zucchero sintattico". Permette di addolcire la sintassi di utilizzo dei propri tipi accettando gli
operatori come chiamate a funzioni. In questo capitolo si imparerà che l'overloading degli operatori è
solo un diverso tipo di chiamata a funzione e si imparerà a scriverne di proprie, occupandosi dell'uso
di argomenti che a volte confondono, restituzione di tipi e la decisione o meno di rendere un operatore
un membro o friend.
Capitolo 13: creazione dinamica di oggetti. Quanti aeroplani avrà bisogno di controllare
un sistema di traffico aereo? Quante figure richiederà un sistema CAD? Nel problema generale della
programmazione, non si conosce la quantità, il tempo di vita o il tipo di oggetti di cui si avrà bisogno
quando il programma andrà in funzione. In questo capitolo, si imparerà come il new e il delete del C+
+ elegantemente risolvono questo problema creando senza rischi oggetti nella heap. Si vedrà anche
come new e delete possono essere sovraccaricate in varie maniere in modo da controllare come la
memoria viene allocata e liberata.
Capitolo 14: ereditarietà e composizione. L’astrazione dei dati permette di creare nuovi
tipi, ma con la composizione ed ereditarietà si possono creare tipi da tipi esistenti. Con la
composizione, si assembla un nuovo tipo usando altri tipi come pezzi e con l’ereditarietà si creano
versioni più specifiche di un tipo esistente. In questo capitolo si imparerà la sintassi, come ridefinire
funzioni e l’importanza della costruzione e distruzione per l’ereditarietà e la composizione.
Capitolo 15: polimorfismo e funzioni virtuali. Per proprio conto, possono servire anche
nove mesi per scoprire e capire questa pietra angolare della OOP. Attraverso piccoli, semplici esempi,
vi vedrà come creare una famiglia di tipi con l’ereditarietà e manipolare oggetti di quella famiglia
attraverso la loro comune classe base. La parola riservata virtual permette di trattare tutti gli oggetti
in questa famiglia genericamente, cioè il corpo del codice non si basa su un informazione di un tipo
specifico. Ciò fa che i programmi siano estensibili e la loro costruzione e la manutenzione del codice
più facile ed economica.
Capitolo 16: introduzione ai Template. L'ereditarietà e la composizione permettono il riuso
del codice dell’oggetto, ma non risolvono tutte le necessità del riuso. I template permettono il riuso del
codice sorgente fornendo al compilatore un modo di sostituire i nomi dei tipi nel corpo di una classe o
di una funzione. A questo serve l’uso delle librerie delle classi container, che sono strumenti
importanti per lo sviluppo rapido e robusto dei programmi orientati agli oggetti ( la libreria del C++
Standard include una significativa libreria di classi container). Questo capitolo dà complete nozioni
per questo indispensabile argomento.