MindView Inc.

[ Suggerimenti ] [ Soluzioni degli Esercizi] [ Volume 2 ] [ Newsletter Gratuita ]
[
Seminari ] [ Seminari su CD ROM ] [ Consulenza]

Pensare in C++, seconda ed. Volume 1

©2000 by Bruce Eckel

[ Capitolo Precedente ] [ Indice Generale ] [ Indice Analitico ] [ Prossimo Capitolo ]

traduzione italiana e adattamento a cura di Umberto Sorbo

Prefazione

Come qualsiasi linguaggio umano, il C++ fornisce un modo per esprimere i concetti. Se è efficace, questo mezzo di espressione sarà significativamente più semplice e flessibile di altre alternative quando i problemi diventano più grossi e complessi.

Non si può vedere il C++ come un' insieme di caratteristiche; alcune funzionalità non hanno senso prese singolarmente. Si può solo usare la somma delle parti se si sta pensando al progetto, non semplicemente alla codifica. E per capire il C++ in questo modo, si devono capire i problemi del C e della programmazione in generale. Questo libro affronta i problemi della programmazione e propone un approccio per risolverli con il C++. Perciò, l’insieme delle funzionalità che si spiegheranno in ogni capitolo sarà basato sul modo nel quale io vedo la soluzione al particolare tipo di problema con il linguaggio. In questo modo spero di portare il lettore, un po’ alla volta, dalla comprensione del C al punto in cui il C++ diventa come la propria lingua nativa.

In ogni momento terrò presente che si vuole costruire nella propria testa un modello che permetta di capire il linguaggio dall'inizio alla fine; se si incontra un puzzle, si potrà fornirlo al nostro modello e dedurne la risposta.

Cercherò di comunicare le intuizioni che mi hanno fatto cominciare a "pensare in C++".

Cosa c'è di nuovo nella seconda edizione

Questo libro è una completa rielaborazione della prima edizione che riflette tutti i cambiamenti introdotti nel C++ dal completamento del suo standard e da ciò che ho imparato da quando ho scritto la prima edizione. L’intero testo presente nella prima edizione è stato esaminato e riscritto, a volte rimuovendo i vecchi esempi, spesso cambiando esempi esistenti e aggiungendone nuovi insieme a molti nuovi esercizi. Il materiale è stato significativamente riordinato per la disponibilità di migliori strumenti ed una mia migliore comprensione di come la gente impara il C++. Per quelli che non hanno una preparazione del C adatta ad affrontare il resto del libro, è stato aggiunto un nuovo capitolo. Esso è una rapida introduzione ai concetti del C e le caratteristiche basi del C++ . Il CD ROM allegato alla fine del libro contiene un seminario che è un'introdurre ai concetti del C necessari per capire il C++ ( o Java). Esso è stato creato da Chuck Allison per la mia società ( MindView, Inc. ) ed è chiamato "Thinking in C: Foundations for Java and C++.". Vi introdurrà agli aspetti del C che sono necessari per avanzare verso il C++ o Java, abbandonando i disgustosi bit di cui i programmatori C devono occuparsi giorno per giorno e da cui il C++ e Java ci allontanano (o addirittura eliminano nel caso di Java) .

Quindi la breve risposta alla domanda "qual è la differenza nella seconda edizione?" è:  

ciò che non è nuovo è stato riscritto a volte fino al punto che non si riconoscerebbero gli esempi ed il materiale originale.

Cosa c'è nel Volume 2 di questo libro

Il completamento dello Standard del C++ ha anche aggiunto un numero di importanti nuove librerie come la string, container e algorithm della libreria Standard C++, così come una nuova complessità nei template. Questi e altri argomenti maggiormente avanzati sono stati inseriti nel Volume 2 di questo libro, inclusi argomenti come ereditarietà multipla, gestione delle eccezioni, disegno di pattern e argomenti riguardanti costruzione e debug di sistemi stabili.

Come ottenere il Volume 2

 Proprio come il libro che si sta ora leggendo , Pensare in C++, Volume 2 è scaricabile interamente dal mio sito web www.BruceEckel.com. Si possono trovare informazioni sul sito circa la prevista data di stampa del Volume 2.

Il sito web contiene anche i sorgenti di entrambi i libri insieme agli aggiornamenti e alle notizie su altri seminari presenti nel CD ROM che MindView, Inc. offre: seminari pubblici, training a domicilio, consulenze, tutoraggio e walkthrough.

Prerequisiti

Nella prima edizione di questo libro, decisi di assumere che qualcun altro vi avesse parlato del C e che si avesse almeno un confortevole livello di lettura di esso. Il mio primo scopo era semplificare ciò che trovavo difficile: il linguaggio C++. In questa edizione ho aggiunto un capitolo che è una rapida introduzione al C, insieme al seminario sul Thinking in C, pubblicato sul CD, ma assumo ancora che si abbia già una minima esperienza di programmazione. In aggiunta, proprio come si imparano nuove parole vedendole intuitivamente nel contesto di un romanzo, è possibile imparare molto sul C dal contesto in cui è usato nel resto del libro.

Imparare il C++

Ho intrapreso la mia strada verso il C++ esattamente dalla stessa posizione in cui mi aspetto sono molti lettori di questo libro: come programmatore con conoscenze di base della programmazione. Cosa peggiore, il mio background e la mia esperienza era nella programmazione a livello di hardware, in cui il C è stato spesso considerato un linguaggio di alto livello e non un modo efficiente per operare sui bit. Scoprii più tardi che non ero nemmeno un buon programmatore C, nascondendo la mia ignoranza delle strutture, malloc() e free() setjmp() e longjmp() ed altri "sofisticati" concetti. Morivo dalla vergogna quando questi argomenti facevano capolino nelle conversazioni, invece di approfittarne per acquisire nuove conoscenze.

Quando cominciai a combattere per capire il C++, l’unico libro decente era l’auto professata "expert’s guide,[1]" di Bjarne Stroustrup così dovetti semplificare i concetti base da solo. Il risultato fu il mio primo libro sul C++,[2] che fu essenziamente un trasferimento cerebrale della mia esperienza. Fu scritto come una guida per il lettore per portare i programmatori allo stesso tempo nel C e C++. Entrambe le edizioni del libro raccolsero entusiastici responsi.

Quasi allo stesso tempo uscì Using C++, cominciai a insegnare il linguaggio in seminari e presentazioni. Insegnare il C++ ( e più tardi Java) divenne la mia professione; in tutto il mondo dal 1989 ho visto teste ciondolanti, facce bianche ed espressioni perplesse nel pubblico. Scoprii qualcosa di interessante durante le esercitazioni quando cominciai a dare lezioni a domicilio a piccoli gruppi di persone. Persino quelle persone che sorridevano e sonnecchiavano erano confuse su molte problematiche. Dopo molti anni in cui ho creato e preparato sezioni tematiche del C++ e Java nella Conferenza sullo sviluppo del software, ho scoperto che io e gli altri speaker tendevamo a dare alla tipica audience troppi argomenti e troppo velocemente. Quindi alla fine, sia per le differenze di livello di audience che per il modo in cui presentavo il materiale, rischiavo di perdere una parte del pubblico. Forse era chiedere troppo, ma poiché sono uno di quelli che oppone resistenza alla tradizionale conferenza ( e per molti, credo, tale resistenza viene dalla noia), volevo provare a tenere su l’attenzione di tutti per andare velocemente.

Per un po’, creavo diverse esposizioni in breve tempo. Così finii per imparare sperimentando e ripetendo ( una tecnica che funziona bene anche nel progetto di un programma C++). Alla fine sviluppai un corso utilizzando tutto ciò che avevo imparato dalla mia esperienza di insegnamento. Affrontati il problema del apprendimento in passi discreti e facili da digerire e per un seminario pratico ( la situazione ideale per imparare) ci sono esercizi che seguono ognuna delle esposizioni. Si possono avere informazioni sui miei seminari pubblici a e anche di quelli che ho trasformato in CD ROM.

La prima edizione di questo libro è stata sviluppata nel giro di due anni ed il materiale di questo libro è stato testato su strada in molte forme ed in diversi seminari. I feedback che ho ricevuto da ogni seminario mi hanno aiutato a cambiare e rifocalizzare il materiale fino a che ho sentito che funzionava bene come mezzo di insegnamento. Ma non è solo una pubblicità del seminario, ho cercato di impacchettare quante più informazioni potevo in queste pagine e strutturarle in modo da passare all’argomento successivo. Cosa più importante il libro è sviluppato per essere utile al lettore solitario che si sforza di imparare un nuovo linguaggio di programmazione.

Scopi

I miei scopi in questo libro sono:

  1. Presentare il materiale un semplice passo alla volta, così che il lettore possa facilmente digerire ogni concetto prima di andare avanti.
  2. Usare esempi che siano quanto più semplici e brevi possibile. Ciò spesso mi impedisce di affrontare problemi del mondo reale, ma ho constatato che i principianti di solito sono più contenti quando capiscono ogni dettaglio di un esempio piuttosto che rimanere impressionati dalla portata del problema che si risolve. In più c’è anche un grosso limite al totale del codice che può essere assorbito in i classe. Perciò a volte ricevo critiche per aver usato "esempi giocattolo", ma voglio accettarle a favore di produrre qualcosa di pedagogicamente utile.
  3. Ordinare con cura la presentazione della caratteristiche in modo che non si veda qualcosa che non sia stato esposto. Naturalmente, questo non è sempre possibile; in queste situazioni sarà data una breve descrizione introduttiva.
  4. Dare ciò che penso sia importante per far capire il linguaggio, piuttosto tutto quello che so. Credo ci sia una "gerarchia dell’importanza delle informazioni" e ci sono dei fatti che al 95 % dei programmatori non avranno mai bisogno di sapere e che li confonderebbe soltanto aumentando la percezione della complessità del linguaggio. Prendendo un esempio dal C, se si memorizza la tabella della precedenza dell'operatore ( non l'ho mai fatto), si può scrivere del codice ingegnoso. Ma se si deve ricordarlo, si confonderà il lettore/manutentore del codice. Quindi si dimentichi la precedenza e si usi le parentesi quando le cose non sono chiare. Lo stesso atteggiamento sarà preso con alcune informazioni del linguaggio C++, che penso più importanti per scrittori di compilatori che per programmatori.
  5. Mantenere ogni sezioni focalizzata in modo che il tempo di lettura ed il tempo tra un esercizio e l'altro sia ragionevole. Ciò non solo mantiene le menti dell'audience più attive e impegnate durante un seminario pratico, ma dà al lettore un grande senso di realizzazione.
  6. Fornire ai lettori una solida base in modo che possano capire bene gli argomenti per proseguire verso corsi e libri più difficili (in particolare il volume 2 di questo libro).
  7. Ho cercato di non usare una particolare versione di C++ perché, per imparare il linguaggio, non penso che i dettagli di una particolare implementazione siano così importanti come il linguaggio stesso. La maggior parte delle documentazioni dei fornitori che concernono le loro implementazioni sono sufficienti.

Capitoli

Il C++ è un linguaggio in cui nuove e diverse caratteristiche sono costruite sulla cima di una sintassi esistente. ( A causa di ciò ci si riferisce spesso ad esso come un linguaggio di programmazione orientato agli oggetti ibrido). Man mano che la gente fa passi in avanti nell'apprendimento, si intuisce il modo in cui i programmatori si muovono da uno stadio all'altro delle caratteristiche del linguaggio C++. Poiché sembra essere la progressione naturale di una mente educata alle procedure, ho deciso di capire e seguire questo stesso percorso ed accelerare il processo ponendo e rispondendo alle domande che mi venivano mentre apprendevo il linguaggio e quelle domande che venivano invece dall'uditorio mentre insegnavo il linguaggio.

Questo corso è stato ideato con una cosa in mente: semplificare il processo di apprendimento del C++. Il feedback dell'uditorio mi ha aiutato a capire quali sono le parti difficili che hanno bisogno di maggiori chiarimenti. Nelle parti in cui sono stato ambiguo ed ho introdotto troppi particolari tutti insieme, mi sono reso conto, nel presentare il materiale, che se si introducono molti argomenti nuovi, li si deve spiegare tutti e si aumenta la confusione dello studente. Di conseguenza ho avuto cura di introdurre il minor numero possibile di argomenti per volta, idealmente un solo concetto principale alla volta per capitolo.

Lo scopo, quindi, è di insegnare un singolo concetto per ciascun capitolo o un piccolo gruppo di concetti associati, in modo che non ci sia dipendenza da altri argomenti. In tal modo si può assimilare ogni pezzo nel contesto della attuale conoscenza prima di andare avanti. Per realizzare ciò, ho lasciato alcune caratteristiche del C per più di quanto preferissi. Il vantaggio consiste nel fatto che non ci si confonderà nel vedere tutte le caratteristiche del C++ prima che esse vengano spiegate, di conseguenza l'introduzione al linguaggio sarà graduale e rifletterà il modo in cui si assimilano gli argomenti se lasciati ai propri mezzi.

Ecco una breve descrizione di ogni capitolo contenuto nel libro:

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. Gli argomenti di default permettono di chiamare la stessa funzione in modi diversi fornendo automaticamente valori di default per alcuni argomenti.

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.

Ulteriori argomenti ( e più avanzati ) sono disponibili nel Volume 2 di questo libro scaricabile da www.BruceEckel.com.

Esercizi

Ho scoperto che gli esercizi sono eccezionalmente utili durante i seminari per completare la comprensione di un argomento, perciò si troverà un insieme di esercizi alla fine di ogni capitolo. Il numero di esercizi è stato incrementato enormemente rispetto alla prima edizione.

Molti degli esercizi sono abbastanza semplici in modo che possano essere finiti in classe in un tempo ragionevole mentre il docente osserva, assicurandosi che tutti gli studenti assorbano il materiale. Qualche esercizio è un po'; più difficile per mantenere gli studenti attivi. La maggior parte degli esercizi sono scritti per essere risolti in breve tempo e sono intesi solo per testare e rispolverare le proprie conoscenze più che presentare difficoltà maggiori ( presumibilmente, li si troverà da soli, o più probabilmente loro troveranno voi).

Le soluzioni degli esercizi

Le soluzioni agli esercizi selezionati si trovano nel documento elettronico The Thinking in C++ Annotated Solution Guide, disponibile in cambio di un piccolo onorario su www.BruceEckel.com.

Sorgenti

I sorgenti di questo libro sono liberi da diritti e sono distribuiti tramite il sito www.BruceEckel.com . I diritti vietano la ripubblicazione dei codici su stampa senza permesso, ma sono concessi i diritti di utilizzo in molte altre situazioni ( si veda sotto).

Il codice è disponibile in un file zippato, pensato per essere estratto su qualsiasi piattaforma che ha un'utility zip ( si può cercare su Internet per trovare una versione per la propria piattaforma se non ne si ha una già installata). Nella directory di partenza dove si è scompattato il codice si troverà la seguente avviso di copyright:

//:! :Copyright.txt
Copyright (c) 2000, Bruce Eckel
i sorgenti dal libro "Pensare in C++"
tutti i diritti riservati TRANNE da quanto permesso
dalle seguenti dichiarazioni: si può liberamente usare questo file
per il proprio lavoro (personale o commerciale),
incluse modifiche o distribuzioni in forma solo eseguibile.
È concesso il permesso per l’uso di questo file in aule, incluso il
suo uso in materiale per lezioni, sempre che il libro
"Pensare in C++" sia citato come sorgente.
Tranne nelle aule, non si può copiare e distribuire 
questo codice; invece, l’unico punto di distribuzione 
è http://www.BruceEckel.com ( e i siti mirror
ufficiali ) dove è disponibile gratuitamente.
 Non si può rimuovere questo copyright
e avviso. Non si possono distribuire versioni modificate dei
 sorgenti di questo pacchetto. 
Non si può utilizzare questo file in versione stampata senza 
permesso esplicito dell'autore.
Bruce Eckel non garantisce l'idoneità di questo software per tutti gli scopi. 
Esso è fornito "come è" senza esplicita o implicita garanzia di nessun 
genere incluso qualsiasi implicita garanzia di commerciabilità e di idoneità
o non violazione. L'intero rischio riguardo la qualità e la performance del 
software è a proprio carico. Bruce Eckel e l'editore non
sono responsabili per qualsiasi danno ricevuto in proprio o da 
terze parti per aver usato o distribuito questo software.
In nessun caso Bruce Eckel e l'editore sono responsabili per 
qualsiasi perdita di profitto o dati o per danni indiretti, diretti, speciali, 
conseguenti, incidentali o punitivi, comunque causati e senza riguardo 
della teoria della responsabilità,
 derivanti dall'uso o dall'incapacità all'uso del software, anche se
Bruce Eckel e l'editore sono stati avvisati della possibilità di tali danni. 
Se il software dovesse risultare difettoso, si assumerà il costo della manutenzione, 
riparazione e correzione. Se si pensa di aver trovato un errore, per favore 
inviate la correzione usando
il modulo che troverete su  www.BruceEckel.com.
 ( Si usi lo stesso modulo per errori che non sono
del codice trovati nel libro.)
///:~
Si può usare il codice nei propri progetti e in aula sempre che l'avviso di copyright venga mantenuto.

Gli standard dei linguaggi

In tutto il libro, quando si riferirà all ' ISO C standard, verrà detto solo 'C'. Solo se sarà necessario distinguere tra Standard C e più vecchi, versioni pre-Standard del C sarà fatta una distinzione. Al tempo della scrittura di questo libro, la commissione per gli standard del C++ aveva finito di lavorare al linguaggio. Perciò, si userà il termine Standard C++ per riferirsi al linguaggio standardizzato.

C'è un po'; di confusione sul nome reale della C++ Standards Committee e sul nome dello standard stesso. Steve Clamage, il presidente della commissione, ha chiarito che:

Ci furono due commissioni per la standardizzazione del C++: la commissione NCITS (inizialmente X3) J16 e la commissione ISO JTC1/SC22/WG14. ANSI costituì NCITS per creare una commissione tecnica per lo sviluppo degli standard nazionali Americani.

Nel 1989 J16 è stata costituita per creare uno standard Americano per il C++. Circa nel 1991 WG14 fu costituita per creare uno standard internazionale. Il progetto J16 fu convertito in un progetto "Type I" (internazionale) e subordinato agli sforzi di standardizzazione ISO.

Le due commissioni si incontrarono alla stessa ora e posto ed il voto della J16 costituì il voto americano su WG14. WG14 delegò il lavoro tecnico alla J16. WG14 votò sul lavoro tecnico di J16.

Lo standard C++ fu creato originariamente come un standard ISO. Ansi votò più tardi ( come raccomandato da J16) per adottare il C++ standard ISO come lo standard americano per il C++.

Quindi 'ISO' è il modo corretto di riferirsi allo standard C++.

Supporto del linguaggio

Il compilatore potrebbe non supportare tutte le caratteristiche discusse in questo libro, specialmente se non si possiede la versione più recente del compilatore. Implementare un linguaggio come il C++ costituisce uno compito enorme ed è possibile che le caratteristiche si presentino a pezzi piuttosto che tutte insieme. Se si prova tuttavia uno degli esempi del libro e si ottengono molti errori dal compilatore, non è necessariamente un bug del codice o del compilatore, può essere semplicemente che esso non sia stato ancora implementato nel compilatore utilizzato nello specifico.

Il CD ROM del libro

Il contenuto primario del CD ROM contenuto alla fine di questo libro è un "seminario su CD ROM" intitolato Thinking in C: Foundations for Java & C++ di Chuck Allison (pubblicato da MindView, Inc., e disponibile in gran quantità su www.BruceEckel.com). Esso contiene molte ore di lezioni audio e slide che possono essere viste sulla maggior parte dei computer se si possiede un lettore di CD ROM ed un sistema acustico. Lo scopo di Thinking in C è di portare il lettore attraverso i fondamenti del linguaggio C. Esso si focalizza sulla conoscenza necessaria che serve per passare ai linguaggi C++ o Java invece di tentare di far diventare chi legge un esperto di tutti gli angoli oscuri del C ( una delle ragioni per l'utilizzo di un linguaggio di alto livello come il C++ o Java è proprio il poter evitare questi angoli oscuri). Esso contiene anche esercizi e soluzioni guidate. Si tenga in mente che poiché il Capitolo 3 di questo libro va oltre il CD Thinking in C, il CD non è un rimpiazzo di quel capitolo, ma dovrebbe essere usato invece come preparazione per questo libro.

Si noti che per usare il CD ROM è necessario avere installato un Web browser sulla macchina che si sta usando.

CD ROM, seminari,
e consulenza

Ci sono seminari sul CD-ROM pianificati per coprire il Volume 1 ed il Volume 2 di questo libro. Essi comprendono molte ore di mie lezioni audio che accompagnano diapositive che coprono il materiale selezionato da ogni capitolo del libro. Esse possono essere viste sulla maggior parte dei computer se si possiede un CD ROM ed un sistema acustico. Questi CD possono essere acquistati su www.BruceEckel.com, dove si troveranno maggiori informazioni e lezioni esempio. La mia azienda, MindView Inc., fornisce seminari pratici pubblici basati sul materiale di questo libro e anche su argomenti avanzati, a cui segue un periodo di esercizi controllati, in modo che ogni studente riceva un'attenzione personale. Forniamo anche istruzione a domicilio, consulenza, tirocinio, walkthrough di progetto e codice. Informazioni e moduli di iscrizioni ai prossimi seminari e altre informazioni si trovano su www.BruceEckel.com.

Io sono disponibile a volte per consulenza di progetto, valutazione di progetti e walkthrough di codice. Quando ho scritto la prima volta dei computer, la mia prima motivazione era di aumentare le mie attività di consulenza, perché trovo che essa sia interessante, educativa e una delle esperienze più piacevoli professionalmente. Perciò farò il mio meglio per inserirvi nei miei programmi o vi fornirò uno dei miei soci ( persone che conosco bene e di mia fiducia e con cui spesso sviluppo e tengo seminari).

Errori

Non importa quanti trucchi usa uno scrittore per trovare gli errori, qualcuno sempre si nasconde e spunta fuori ad un lettore fresco. Se si scopre qualcosa che si pensa possa essere un errore, si può usare il modulo per le correzioni che si troverà su www.BruceEckel.com. Il vostro aiuto sarà apprezzato.

La copertina

La prima edizione di questo libro ha la mia faccia sulla copertina, ma originariamente volevo una copertina per la seconda edizione che fosse più artistica come la copertina di Thinking in Java. Per qualche ragione, il C++ mi suggeriva l'Art Deco con le sue semplici curve e cromature. Avevo in mente qualcosa tipo quei poster di navi e aeroplani con i loro ampi corpi.

Il mio amico Daniel Will-Harris, (www.Will-Harris.com) che ho incontrato per la prima volta nel coro della scuola superiore, ha continuato fino a diventare un disegnatore e scrittore di fama mondiale. Egli ha fatto virtualmente tutti i miei disegni inclusa la copertina della prima edizione di questo libro. Durante la preparazione della copertina, Daniel, non soddisfatto di come proseguiva il lavoro, chiese: "In che modo ciò mette in relazione le persone ai computer?". Eravamo disorientati.

All'improvviso, senza nessun motivo, mi chiese di mettere la mia faccia sullo scanner. Daniel usò l'autotrace di uno dei suoi programmi grafici (Corel Xara, il suo preferito) sull'immagine della mia faccia. Come egli lo descrive: "l'autotrace è il modo in cui il computer trasforma un immagine in una serie di line e curve che gli piacciono veramente". Poi ha giocato fino a che non ha ottenuto qualcosa che sembrava tipo una cartina topografica della mia faccia, un' immagine che potrebbe essere un modo in cui il computer vede la gente.

Presi questa immagine e la fotocopiai su carta per gli acquerelli ( qualche fotocopiatrice a colori può gestirne piccole quantità ) e poi cominciai a fare esperimenti aggiungendo acquerelli all'immagine. Abbiamo scelto quello che ci piaceva di più, poi Daniel lo ha scannerizzato di nuovo e sistemato nella copertina, aggiungendo il testo ed altri elementi. Tutto il processo è avvenuto lungo diversi mesi, principalmente per il tempo che ci è voluto per fare gli acquerelli. Ma mi sono divertito molto perché ho partecipato al lato artistico della copertina e perché mi ha incentivato a fare molti acquerelli ( quello che si dice sulla pratica è vero ).

Progetto e produzione del libro

Il design interiore del libro è stato creato da Daniel Will-Harris, che era solito giocare con i trasferibili alla scuola superiore mentre aspettava l’invenzione del computer ed il desktop publishing. Tuttavia, ho prodotto le pagine da solo, quindi gli errori di scrittura sono i miei. Microsoft® Word per Windows versione 8 e 9 sono stati usati per scrivere il libro e per creare le pagine, anche per la creazione dell’elenco del contenuto e dell’indice. ( Ho creato un server automation COM in Python, chiamato macro Word VBA , per aiutarmi a marcare l’indice). Python ( si veda ) è stato usato per creare degli strumenti per controllare il codice e avrebbe dovuto essere usato per l’estrazione del codice, l’avessi scoperto prima.

Ho creato i diagrammi usando Visio® - grazie alla Visio Corporation per aver creato questo utile strumento.

Il carattere principale è Georgia e i titoli sono in Verdana. La versione finale è stato prodotta con Adobe® Acrobat 4 e presa direttamente da questa per la stampa – molte grazie ad Adobe per aver creato uno strumento che permette di mandare documenti per email, poiché permette di fare revisioni multiple in un singolo giorno piuttosto che affidarsi sulla mia stampante laser e su servizi espressi notturni. ( Provammo per prima il processo di Acrobat con Thinking in Java e riuscii a caricare la versione finale di quel libro alla stampante in U.S. dal Sud Africa).

La versione HTML è stata creata esportando il documento Word in RTF e poi usando RTF2HTML (si veda http://www.sunpack.com/RTF/) , che ha fatto la maggior parte del lavoro per la conversione in HTML ( grazie a Chris Hector per aver realizzato questo utile e affidabile strumento).

I file finali sono stati puliti con un programma in Python che ho messo insieme e le WMF sono state convertite in GIF usando JASC® PaintShop Pro 6 e il suo strumento di conversione ( grazie a JASC per aver risolto tanti dei miei problemi con il loro eccellente prodotto). Per evidenziare la sintassi è stato usato uno script Perl fornito gentilmente da Zafir Anjum.

Ringraziamenti

Per prima cosa, grazie a tutti quelli che hanno inviato correzioni e suggerimenti con Internet, siete stati tremendamente di aiuto per il miglioramento della qualità del libro e non avrei potuto fare a meno di voi. Un grazie speciale a John Cook.

Le idee e conoscenze di questo libro sono venute fuori da molte sorgenti: da amici come Chuck Allison, Andrea Provaglio, Dan Saks, Scott Meyers, Charles Petzold, and Michael Wilk; pionieri del linguaggio come Nathan Myers ( che è stato particolarmente di aiuto e generoso con le sue intuizioni), Plauger, Reg Charney, Tom Penello, Tom Plum, Sam Druker, and Uwe Steinmueller; la gente che ha parlato nella mia sezione C++ alla Software Development Conference; e spesso agli studenti dei miei seminari che fanno domande che ho bisogno di sentire in modo da rendere il materiale più chiaro.

Un enorme grazie al mio amico Gen Kiyooka, la cui azienda Digigami mi ha fornito un web server.

Il mio amico Richard Hale Shaw ed io abbiamo parlato del C++ insieme; le intuizioni di Richard ed il suo sostegno sono state di grande aiuto ( e anche quello di Kim). Grazie anche a KoAnn Vikoren, Eric Faurot, Jennifer Jessup, Tara Arrowood, Marco Pardi, Nicole Freeman, Barbara Hanscome, Regina Ridley, Alex Dunne, ed il resto del gruppo al MFI.

Un grazie speciale a tutti i miei insegnanti e studenti ( che sono anche miei insegnanti).

E per gli scrittori preferiti, la mia profonda stima e comprensione per i vostri sforzi: John Irving, Neal Stephenson, Robertson Davies (ci mancherai), Tom Robbins, William Gibson, Richard Bach, Carlos Castaneda e Gene Wolfe.

A Guido van Rossum, per aver inventato Python e averlo dato altruisticamente al mondo. Hai arricchito la mia vita con il tuo contributo.

Grazie alle persone della Prentice Hall: Alan Apt, Ana Terry, Scott Disanno, Toni Holm, ed il mio editore per la copia elettronica Stephanie English. Nel marketing, Bryan Gambrel e Jennie Burger.

Sonda Donovan mi ha aiutato con la produzione del CD Rom. Daniel Will-Harris ( naturalmente ) ha creato il disegno che è sul disco stesso.

A tutti i favolosi abitanti di Crested Butte, grazie per averla resa un posto magico, specialmente Al Smith (creatore del meraviglioso Camp4 Coffee Garden), i miei vicini Dave & Erika , Marsha alla libreria Heg’s Place. Pat & John al Teocalli Tamale, Sam al Bakery Café e Tiller per il suo aiuto nella ricerca audio. E a tutte le persone al Camp4 che hanno reso interessanti le mie mattine.

Il gruppo di supporto degli amici include, ma non è limitato solo a, Zack Urlocker, Andrew Binstock, Neil Rubenking, Kraig Brockschmidt, Steve Sinofsky, JD Hildebrandt, Brian McElhinney, Brinkley Barr, Larry O’Brien, Bill Gates al Midnight Engineering Magazine, Larry Constantine, Lucy Lockwood, Tom Keffer, Dan Putterman, Gene Wang, Dave Mayer, David Intersimone, Claire Sawyers, gli Italiani (Andrea Provaglio, Rossella Gioia, Laura Fallai, Marco & Lella Cantu, Corrado, Ilsa e Christina Giustozzi), Chris e Laura Strand (e Parker), gli Almquists, Brad Jerbic, Marilyn Cvitanic, the Mabrys, the Haflingers, the Pollocks, Peter Vinci, i Robbins, i Moelters, Dave Stoner, Laurie Adams, i Cranstons, Larry Fogg, Mike e Karen Sequeira, Gary Entsminger e Allison Brody, Kevin, Sonda, & Ella Donovan, Chester e Shannon Andersen, Joe Lordi, Dave e Brenda Bartlett, i Rentschlers, Lynn e Todd, e le loro famiglie. E naturalmente Mamma e Papà.


[1] Bjarne Stroustrup, The C++ Programming Language, Addison-Wesley, 1986 (prima edizione).

[2] Using C++, Osborne/McGraw-Hill 1989.

[3] Using C++ and C++ Inside & Out, Osborne/McGraw-Hill 1993.

[ Capitolo Precedente ] [ Indice generale ] [ Indice analitico ] [ Prossimo Capitolo ]


Ultima modifica:14/03/2004