I. Préface▲
Comme n'importe quel langage humain, le C++ permet d'exprimer des concepts. S'il est réussi, ce support d'expression sera plus simple et plus flexible que les solutions alternatives, qui au fur et à mesure que les problèmes s'amplifient, deviennent plus complexes.
On ne peut pas simplement considérer le C++ comme un ensemble de fonctionnalités - certaines fonctionnalités n'ayant pas de sens prises à part. On ne peut utiliser la somme des parties que si l'on pense conception, et non simplement code. Et pour comprendre le C++ de cette façon, il faut comprendre les problèmes liés au C et à la programmation en général. Ce livre traite des problèmes de programmation, pourquoi ce sont des problèmes, et l'approche que le C++ a prise pour résoudre de tels problèmes. Ainsi, le groupe de fonctionnalités que je traite dans chaque chapitre sera organisé selon la façon que j'ai de voir comment le langage résout un type particulier de problème. De cette manière j'espère vous amener, au fur et à mesure, depuis la compréhension du C jusqu'au point où la mentalité C++ devient une seconde nature.
Du début à la fin, j'adopterai l'attitude selon laquelle vous voulez construire un modèle dans votre tête qui vous permettra de comprendre le langage jusque dans ses moindres détails - si vous avez affaire à un puzzle, vous serez capable de l'assembler selon votre modèle et d'en déduire la réponse. J'essayerai de vous transmettre les idées qui ont réarrangé mon cerveau pour me faire commencer à «penser en C++.»
I-A. Quoi de neuf dans cette seconde édition ?▲
Ce livre est une réécriture complète de la première édition pour refléter tous les changements introduits dans le langage C++ par la finalisation du standard C++, et pour refléter également ce que j'ai appris depuis l'écriture de la première édition. L'ensemble du texte présent dans la première édition a été examiné et réécrit, parfois en supprimant de vieux exemples, souvent en modifiant les exemples existants et en en ajoutant de nouveaux, et en ajoutant beaucoup de nouveaux exercices. Un réarrangement et un nouveau classement significatif du document ont eu lieu afin de répercuter la disponibilité de meilleurs outils et ma meilleure appréhension de la façon dont les gens apprennent le C++. Un nouveau chapitre a été ajouté, rapide introduction aux concepts du C et aux fonctionnalités de base du C++, pour ceux qui n'ont pas l'expérience du C pour aborder le reste du livre. Le CD-ROM relié au dos du livre contient une conférence qui est une introduction encore plus douce aux concepts du C nécessaires pour comprendre le C++ (ou le Java). Elle a été créée par Chuck Allison pour ma société (MindView, Inc.), et est appelée « Penser en C : Bases pour Java et C++. » Elle vous présente les aspects du C nécessaires pour passer au C++ ou à Java, en laissant de côté les parties difficiles auxquelles les programmeurs C sont confrontés dans leur travail de tous les jours, mais que les langages C++ et Java vous évitent d'utiliser (voire éliminent, dans le cas de Java).
Donc la réponse courte à la question « Qu'est-ce qui est nouveau dans la deuxième édition ? » est : ce qui n'est pas nouveau a été réécrit, parfois à tel point que vous ne reconnaitrez pas les exemples et le contenu d'origine.
I-A-1. Qu'y a-t-il dans le Volume 2 de ce livre ?▲
L'achèvement du standard C++ a également ajouté un certain nombre de nouvelles bibliothèques importantes, comme les chaines de caractères ( string) et les conteneurs et algorithmes de la bibliothèque standard du C++, aussi bien que la nouvelle complexité des templates. Ces nouveautés et d'autres sujets plus avancés ont été relégués au volume 2 de ce livre, y compris des problèmes tels l'héritage multiple, la gestion des exceptions, les modèles de conception, et les sujets sur les systèmes stables de compilation et de débogage.
I-A-2. Comment récupérer le Volume 2 ?▲
Tout comme le livre que vous tenez actuellement, Penser en C++, Volume 2 est en téléchargement dans sa totalité sur mon site Web www.BruceEckel.com. Vous pouvez trouver la date d'impression prévue du Volume 2 sur le site.
Le site Web contient également le code source pour les deux livres, avec des mises à jour et des informations sur d'autres conférences sur CD-ROM proposées par MindView, Inc., des conférences publiques, et des formations, consultations, tutelles, et visites internes.
I-B. Prérequis▲
Dans la première édition de ce livre, je suis parti du principe que quelqu'un d'autre vous avait enseigné le C et que vous aviez au moins la capacité de le lire confortablement. Mon objectif premier était de simplifier ce que je trouvais difficile : le langage C++. Dans cette édition j'ai ajouté un chapitre qui est une rapide introduction au C, présent avec le CD du séminaire Penser en C, mais je considère toujours que vous avez déjà une certaine expérience en programmation. En outre, de même que vous apprenez beaucoup de nouveaux mots intuitivement en les voyant dans le contexte d'un roman, il est possible d'apprendre beaucoup sur C à partir du contexte dans lequel il est utilisé dans le reste du livre.
I-C. Apprendre le C++▲
J'ai suivi le même cheminement vers le C++ que les lecteurs de ce livre: avec une attidude très pragmatique envers la programmation, très « détails pratiques ». Pire, mon passé et mon expérience étaient tournés vers la programmation embarquée niveau matériel, dans laquelle le C était souvent considéré comme un langage de haut niveau et d'une surpuissance inefficace pour déplacer des bits. J'ai découvert plus tard que je n'étais pas vraiment un très bon programmeur C, cachant mon ignorance des structures, malloc( ) et free( ), setjmp( ) et longjmp( ), et autres concepts « sophistiqués », m'éloignant rapidement avec honte quand les conversations abordaient ces sujets, au lieu de tendre vers de nouvelles connaissances.
Quand j'ai commencé ma lutte pour apprendre le C++, le seul livre décent était l'autoproclamé « Guide de l'expert, », de Bjarne Stroustrup, et j'étais donc livré à moi-même pour simplifier les concepts de base. Ceci a eu comme conséquence mon premier livre sur le C++, (1)ce qui était essentiellement une extraction cérébrale de mon expérience. Il a été conçu comme un guide pour le lecteur afin d'introduire les programmeurs en même temps au C et au C++. Les deux éditions (2)du livre ont entrainé une réaction enthousiaste.
Pratiquement en même temps que la sortie de Using C++, j'ai commencé à enseigner le langage dans des conférences et des présentations. Enseigner le C++ (et plus tard le Java) est devenu ma profession ; j'ai vu des têtes penchées, des visages livides, et des expressions embarrassées dans les assistances partout dans le monde depuis 1989. Alors que je commençais à donner des formations internes à de plus petits groupes de personnes, j'ai découvert une chose pendant les exercices. Même ces personnes qui souriaient et acquiesçaient étaient perdues devant de nombreux problèmes. J'ai découvert, en créant et présidant pendant de nombreuses années les sujets C++ et Java à la conférence sur le développement logiciel, que les intervenants (moi compris) avaient tendance à présenter au public type trop de sujets trop rapidement. Ainsi en définitive, du fait de la diversité des niveaux de l'assistance et de la manière dont j'ai présenté le contenu, je finissais par perdre une partie du public. Peut-être est-ce trop demander, mais comme je suis une de ces personnes réfractaires aux cours traditionnels (et pour beaucoup, je crois, une telle résistance est générée par l'ennui), j'ai voulu essayer de garder tout le monde dans le rythme.
Pendant quelque temps, j'ai créé un certain nombre de présentations différentes dans un ordre assez court. Ainsi, j'ai fini par apprendre par expérience et itération (une technique qui fonctionne également bien dans la conception de programmes C++). Par la suite, j'ai développé un cours en utilisant tout ce que j'avais appris de mon expérience d'enseignement. Il aborde le problème de l'apprentissage par des étapes distinctes, faciles à digérer, et pour impliquer l'auditoire (situation d'apprentissage idéale), des exercices suivent chacune des présentations. Vous pouvez découvrir mes conférences publiques sur www.BruceEckel.com, et vous pouvez également vous y renseigner sur les conférences que j'ai publié en CD-ROM.
La première édition de ce livre s'est développée dans un cheminement de deux ans, et le contenu de ce livre a été testé en situation dans beaucoup de formes dans de nombreuses conférences. Le retour que j'ai perçu de chaque conférence m'a aidé à modifier et recentrer le sujet jusqu'à ce que je sente qu'il fonctionne bien comme outil didactique. Mais ce n'est pas simplement une documentation de conférence ; j'ai essayé d'entasser autant d'informations que possible dans ces pages, et de la structurer pour vous emmener vers le sujet suivant. Plus que toute autre chose, le livre est conçu pour servir le lecteur solitaire qui lutte avec un nouveau langage de programmation.
I-D. Buts▲
Dans ce livre je me suis donné comme buts :
- Présenter le cours pas à pas afin que le lecteur assimile chaque concept avant d'aller plus loin.
- Utiliser des exemples qui soient aussi simples et courts que possible. Souvent, cela me détournera des problèmes « du monde réel », mais j'ai remarqué que les débutants sont généralement plus satisfaits de comprendre chaque détail d'un exemple qu'ils ne sont impressionnés par la portée du problème qu'il résout. Il y a également une limite à la taille du code qui peut être assimilé dans une situation de cours magistral, limite qu'il faut impérativement ne pas dépasser. À ce sujet je reçois parfois des critiques pour avoir utilisé des « exemples jouets », et je les accepte volontiers, avec le prétexte que ce que je présente est utile, pédagogiquement parlant.
- Enchaîner soigneusement la présentation des fonctionnalités afin que l'on ne rencontre jamais quoi que ce soit qui n'ait jamais été exposé. Bien entendu, ce n'est pas toujours possible, et, dans de telles situations, je donnerai une brève description en introduction.
- Montrer ce que je pense être important concernant la compréhension du langage, plutôt qu'exposer tout mon savoir. Je crois que l'information est fortement hiérarchisée, qu'il est avéré que 95 % des programmeurs n'ont pas besoin de tout connaitre, et que cela ne ferait que les embrouiller et accroître leur impression de complexité du langage. Pour prendre un exemple en C, en connaissant par cœur le tableau de priorité des opérateurs (ce qui n'est pas mon cas), il est possible d'écrire un code astucieux. Mais si vous y réfléchissez un instant, ceci risque de dérouter le lecteur et/ou le mainteneur de ce code. Il est donc préférable d'oublier la priorité des opérateurs, et d'utiliser des parenthèses lorsque les choses ne sont pas claires. Une attitude similaire sera adoptée avec certaines informations du langage C++, qui je pense sont plus importantes pour les réalisateurs de compilateurs que pour les programmeurs.
- Maintenir chaque section assez concentrée de telle manière que le temps de lecture - et le temps entre les exercices - soit raisonnable. Non seulement cela maintient l'attention et l'implication des auditeurs lors d'un séminaire, mais cela donne au lecteur une plus grande impression de travail bien fait.
- Munir les lecteurs de bases solides afin que leurs connaissances soient suffisantes pour suivre un cours ou lire un livre plus difficiles (en particulier, le volume 2 de ce livre).
- J'ai essayé de n'utiliser aucune version particulière d'un quelconque revendeur C++ parce que, pour apprendre un langage, je ne pense pas que les détails d'une implémentation particulière soient aussi importants que le langage lui-même. La documentation fournie par les revendeurs au sujet de leurs propres spécificités d'implémentation est la plupart du temps suffisante.
I-E. Chapitres▲
Le C++ est un langage dans lequel des fonctionnalités nouvelles et différentes ont été mises en place à partir d'une syntaxe existante (de ce fait, il est considéré comme un langage de programmation orienté objet hybride). Au fur et à mesure que des gens dépassaient la phase d'apprentissage, nous avons commencé à comprendre la manière dont les développeurs franchissaient les étapes des fonctionnalités du langage C++. Puisque cela semblait être la progression naturelle d'un esprit entrainé aux langages procéduraux, j'ai décidé de comprendre et de suivre moi-même ce cheminement et d'accélérer le processus en exprimant et en répondant aux questions qui me sont venues alors que j'apprenais ce langage, ou qui sont venues de ceux à qui j'apprenais ce langage.
J'ai conçu ce cours en gardant une chose à l'esprit : améliorer le processus d'apprentissage du C++. Les réactions de mes auditoires m'ont aidé à comprendre quelles parties étaient difficiles et nécessitaient des éclaircissements particuliers. Dans les domaines dans lesquels j'ai été ambitieux et où j'ai inclus trop de fonctionnalités à la fois, j'ai été amené à comprendre - à travers la présentation de ces connaissances - que si vous incluez beaucoup de nouvelles fonctionnalités, vous devez toutes les expliquer, et cela génère facilement la confusion des étudiants. En conséquence, j'ai essayé d'introduire le moins de fonctionnalités possible à la fois ; idéalement, un concept principal par chapitre seulement.
L'objectif est alors d'enseigner un unique concept pour chaque chapitre, ou un petit groupe de concepts associés, de telle façon qu'aucune fonctionnalité additionnelle ne soit requise. De cette façon, vous pouvez digérer chaque partie en fonction de vos connaissances actuelles avant de passer à la suivante. Pour cela, j'ai conservé des fonctionnalités du C plus longtemps que je ne l'aurais souhaité. L'avantage, c'est que vous ne serez pas perturbés par la découverte de fonctionnalités C++ utilisées avant d'être expliquées, et votre introduction à ce langage sera douce et reflétera la manière dont vous l'auriez assimilé si vous deviez vous débrouiller seul.
Voici une rapide description des chapitres de cet ouvrage :
Chapitre 1 : Introduction à l'objet. Quand les projets sont devenus trop importants et complexes à maintenir simplement, la « crise du logiciel » est née, avec des programmeurs disant « Nous ne pouvons pas terminer les projets, et si nous le pouvons, ils sont trop chers ! ». Cela a entrainé un certain nombre de réponses, qui sont développées dans ce chapitre avec les idées de la programmation orientée objet (POO) et comment elle tente de résoudre la crise du logiciel. Ce chapitre vous entraine à travers les concepts et fonctionnalités de base de la POO et introduit également les processus d'analyse et de conception. Par ailleurs, vous découvrirez les avantages et inconvénients de l'adoption du langage, ainsi que des suggestions pour entrer dans le monde du C++.
Chapitre 2 : Créer et utiliser des objets. Ce chapitre explique le processus de création de programmes utilisant des compilateurs et des bibliothèques. Il introduit le premier programme C++ du livre et montre comment les programmes sont construits et compilés. Des bibliothèques objet de base disponibles dans le Standard C++ sont alors introduites. Lorsque vous aurez terminé ce chapitre, vous aurez une bonne compréhension de ce que signifie écrire un programme C++ utilisant les bibliothèques objet disponibles immédiatement.
Chapitre 3 : Le C dans C++. Ce chapitre est une vue d'ensemble dense des fonctionnalités du C qui sont utilisées en C++, ainsi que d'un certain nombre de fonctionnalités de base disponibles uniquement en C++. Il présente également « make », un utilitaire commun dans le monde du développement logiciel, qui est utilisé pour compiler tous les exemples de ce livre (le code source du livre, qui est disponible sur www.BruceEckel.com, contient un makefile pour chaque chapitre). Le chapitre 3 suppose que vous ayez de solides connaissances dans des langages de programmation procéduraux comme le Pascal, le C, ou même du Basic (tant que vous avez écrit beaucoup de code dans ce langage, particulièrement des fonctions). Si vous trouvez ce chapitre un peu trop dense, vous devriez commencer par la conférence Penser en C disponible sur le CD livré avec ce livre (et également disponible sur www.BruceEckel.com).
Chapitre 4 : Abstraction des données. La plupart des fonctionnalités en C++ tournent autour de la possibilité de créer de nouveaux types de données. Non seulement cela permet une meilleure organisation du code, mais aussi cela prépare les fondations pour des capacités plus puissantes de POO. Vous verrez comme cette idée est facilitée par le simple fait de mettre des fonctions à l'intérieur de structures, les détails sur la façon de le faire, et le type de code que cela entraine. Vous apprendrez aussi la meilleure manière d'organiser votre code en fichiers d'en-tête et fichiers d'implémentation.
Chapitre 5 : Masquer l'implémentation. Vous pouvez décider que certaines données ou fonctions de votre structure sont inaccessibles à l'utilisateur de ce nouveau type en les rendant privées. Cela signifie que vous pouvez séparer l'implémentation sous-jacente de l'interface que le programmeur client peut voir, et ainsi permettre de modifier facilement cette implémentation sans pour autant affecter le code du client. Le mot clef class est également présenté comme un moyen spécialisé de description d'un nouveau type de données, et la signification du mot « objet » est démystifiée (c'est une variable spécialisée).
Chapitre 6 : Initialisation et nettoyage. Une des erreurs C les plus classiques provient de la non-initialisation des variables. Le constructeur du C++ vous permet de garantir que les variables de votre nouveau type de données (« les objets de votre classe ») seront toujours initialisées correctement. Si vos objets nécessitent aussi une certaine forme de nettoyage, vous pouvez garantir que ce nettoyage aura toujours lieu à l'aide du destructeur du C++.
Chapitre 7 : Surcharge de fonctions et arguments par défaut. C++ est prévu pour vous aider à construire des projets volumineux, complexes. Tout en le faisant, vous pouvez introduire des bibliothèques multiples qui utilisent les mêmes noms de fonctions, et vous pouvez aussi choisir d'utiliser le même nom avec différentes significations dans une bibliothèque unique. C++ le facilite avec la surcharge de fonction, qui vous permet de réutiliser le même nom de fonction tant que les listes d'arguments sont différentes. Les arguments par défaut vous permettent d'appeler la même fonction de différentes façons en fournissant automatiquement des valeurs par défauts pour certains de vos arguments.
Chapitre 8 : Constantes. Ce chapitre couvre les mots-clés const et volatile, qui ont des significations supplémentaires en C++, particulièrement à l'intérieur d'une classe. Vous apprendrez ce que signifie appliquer const à la définition d'un pointeur. Ce chapitre vous expliquera aussi comment la signification de const varie quand il est utilisé à l'intérieur ou à l'extérieur des classes, et comment créer des constantes dans les classes à la compilation.
Chapitre 9 : Fonctions 'inline'. Les macros du préprocesseur éliminent les couts d'appel de fonction, mais le préprocesseur élimine aussi la vérification du type C++ valable. La fonction 'inline' apporte tous les avantages d'une macro du préprocesseur plus tous ceux d'un véritable appel de fonction. Ce chapitre explore complètement l'implémentation et l'utilisation des fonctions inline.
Chapitre 10 : Contrôle des noms. Créer des noms est une activité fondamentale en programmation, et quand un projet devient important, le nombre de noms peut devenir envahissant. Le C++ permet un grand contrôle des noms pour leur création, leur visibilité, leur placement de stockage, et leurs liens. Ce chapitre vous montre comment les noms sont contrôlés en C++ en utilisant deux techniques. Tout d'abord, le mot clef static est utilisé pour contrôler la visibilité et les liens, et nous étudions sa signification particulière avec les classes. Une technique bien plus utile pour contrôler les noms de portée globale est la fonctionnalité d' espace de nommage du C++, qui vous permet de séparer l'espace de nom global en régions distinctes.
Chapitre 11 : Références et constructeur par copie. Les pointeurs C++ fonctionnent comme les pointeurs C avec l'avantage supplémentaire d'une vérification du type plus forte en C++. Le C++ fournit également une autre possibilité de manipulation des adresses : de l'Algol et du Pascal, le C++ relève la référence, qui laisse le compilateur gérer la manipulation des adresses alors que vous utilisez la notation normale. Vous rencontrerez aussi le constructeur par copie, qui contrôle la manière dont les objets sont passés par valeur en argument ou en retour de fonction. En conclusion, le pointeur-vers-membre du C++ sera éclairci.
Chapitre 12 : Surcharge des opérateurs. Cette fonctionnalité est parfois appelée le « sucre syntaxique » ; elle vous permet d'adoucir la syntaxe d'utilisation de votre type en autorisant des opérateurs comme des appels de fonctions. Dans ce chapitre vous apprendrez que la surcharge des opérateurs est simplement un type différent d'appel de fonction et vous apprendrez à écrire le vôtre, en prenant en considération les utilisations parfois déroutantes des arguments, des types de retours, et la décision de faire d'un opérateur soit un membre soit un ami.
Chapitre 13 : Création dynamique des objets. Combien d'avions un système de gestion du trafic aérien devra-t-il contrôler ? Combien de formes un système de DAO nécessitera-t-il ? Dans le problème général de la programmation, vous ne pouvez pas connaitre la quantité, la durée de vie, ou même le type des objets requis par votre programme en fonctionnement. Dans ce chapitre, vous apprendrez comment les new et les delete du C++ répondent d'une manière élégante à ce problème en créant sans risque des objets sur le tas. Vous verrez aussi comment new et delete peuvent être surchargés de multiples façons, vous permettant de contrôler l'allocation et la libération de la mémoire.
Chapitre 14 : Héritage et composition. L'abstraction des données vous permet de créer de nouveaux types de toutes pièces, mais avec la composition et l'héritage, vous pouvez créer de nouveaux types à partir de types existants. Avec la composition, vous assemblez un nouveau type en utilisant d'autres types comme des pièces, et avec l'héritage, vous créez une version plus spécifique d'un type existant. Dans ce chapitre, vous apprendrez la syntaxe, la redéfinition des fonctions, et l'importance de la construction et de la destruction dans l'héritage et la composition.
Chapitre 15 : Polymorphisme et fonctions virtuelles. Tout seul, vous pourriez prendre neuf mois pour découvrir et comprendre cette pierre angulaire de la POO. À travers des exemples courts et simples, vous verrez comment créer une famille de types avec l'héritage, et manipuler les objets de cette famille à travers leur classe de base commune. Le mot clef virtual vous permet de traiter de façon générique tous les objets de cette famille, ce qui signifie que la majeure partie de votre code ne reposera pas sur des informations spécifiques des types. Cela rend votre programme extensible, et la construction des programmes et la maintenance du code sont plus simples et moins coûteuses.
Chapitre 16 : Introduction aux modèles. L'héritage et la composition vous permettent de réutiliser le code des objets, mais cela ne résout pas tous vos besoins de réutilisation. Les modèles permettent de réutiliser le code source en fournissant au compilateur un moyen de substituer des noms de types dans le corps d'une classe ou d'une fonction. Cela aide à l'utilisation de bibliothèques de classes conteneurs, qui sont des outils importants pour le développement rapide et robuste de programmes orientés objet (la bibliothèque standard C++ inclus une bibliothèque significative de classes conteneurs). Ce chapitre vous donne des bases complètes sur ce sujet essentiel.
Des sujets supplémentaires (et plus avancés) sont disponibles dans le tome 2 de ce livre, qui peut être téléchargé sur le site www.BruceEckel.com.
I-F. Exercices▲
Je me suis aperçu que des exercices sont très utiles lors d'un séminaire pour consolider les connaissances des étudiants, on en trouvera donc un ensemble à la fin de chaque chapitre. Le nombre d'exercices a été considérablement augmenté par rapport à celui de la première édition.
Un grand nombre d'entre eux sont assez simples de sorte qu'ils peuvent être réalisés en un temps raisonnable dans le contexte d'une salle de classe, pendant que l'instructeur vérifie que tous les étudiants ont assimilé le sujet de la leçon. Quelques exercices sont plus pointus, afin d'éviter l'ennui chez les étudiants expérimentés. La majeure partie des exercices sont conçus pour être réalisés rapidement, ainsi que pour tester et perfectionner les connaissances plutôt que de représenter des défis majeurs. (Je présume que vous les trouverez par vous-même - ou plutôt qu'ils vous trouveront).
I-F-1. Solutions des exercices▲
Les solutions des exercices se trouvent dans le document électronique The Thinking in C++ Annotated Solution Guide, disponible pour un faible cout sur http://www.BruceEckel.com.
I-G. Le Code Source▲
Le code source de ce livre est disponible en freeware sous copyright, via le site Web http://www.BruceEckel.com. Le copyright vous empêche de réutiliser le code sans autorisation dans un médium imprimé, mais vous accorde le droit de l'employer dans beaucoup d'autres situations (voir ci-dessous).
Le code est disponible sous forme de fichier zippé, conçu pour être extrait sous toutes les plateformes disposant d'un utilitaire “zip” (la plupart le sont - vous pouvez effectuer une recherche sur l'Internet afin de trouver une version pour votre plateforme si vous n'avez rien de préinstallé). Dans le répertoire de départ où vous avez décompacté le code, vous trouverez la mention de copyright suivante :
//:! :Copyright.txt
Copyright (c) 2000, Bruce Eckel
Source code file from the book "Thinking in C++"
All rights reserved EXCEPT as allowed by the
following statements: You can freely use this file
for your own work (personal or commercial),
including modifications and distribution in
executable form only. Permission is granted to use
this file in classroom situations, including its
use in presentation materials, as long as the book
"Thinking in C++" is cited as the source.
Except in classroom situations, you cannot copy
and distribute this code; instead, the sole
distribution point is http://www.BruceEckel.com
(and official mirror sites) where it is
available for free. You cannot remove this
copyright and notice. You cannot distribute
modified versions of the source code in this
package. You cannot use this file in printed
media without the express permission of the
author. Bruce Eckel makes no representation about
the suitability of this software for any purpose.
It is provided "as is" without express or implied
warranty of any kind, including any implied
warranty of merchantability, fitness for a
particular purpose, or non-infringement. The entire
risk as to the quality and performance of the
software is with you. Bruce Eckel and the
publisher shall not be liable for any damages
suffered by you or any third party as a result of
using or distributing this software. In no event
will Bruce Eckel or the publisher be liable for
any lost revenue, profit, or data, or for direct,
indirect, special, consequential, incidental, or
punitive damages, however caused and regardless of
the theory of liability, arising out of the use of
or inability to use software, even if Bruce Eckel
and the publisher have been advised of the
possibility of such damages. Should the software
prove defective, you assume the cost of all
necessary servicing, repair, or correction. If you
think you've found an error, please submit the
correction using the form you will find at
www.BruceEckel.com. (Please use the same
form for non-code errors found in the book.)
///:~
Vous êtes autorisés à utiliser le code pour vos projets ainsi qu'à des fins d'éducation à la condition de conserver l'indication de copyright.
I-H. Normes du langage▲
Dans ce livre, pour me référer à la conformité au standard C ISO, je parlerai généralement simplement de 'C'. Je ferai une distinction uniquement s'il est nécessaire de différencier le C Standard de versions du C plus anciennes, préStandard.
Alors que j'écris ce livre, le comité de normalisation du C++ a terminé de travailler sur le langage. Ainsi, j'utiliserai le terme C++ standard pour me référer au langage standardisé. Si je me réfère simplement à C++ vous devez considérer que je parle du C++ standard.
Il y a une certaine confusion à propos du nom exact du comité de normalisation du C++, et du nom de la norme elle-même. Steve Clamage, président du comité, l'a clarifié :
Il y a deux comités de normalisation du C++ : le comité J16 NCITS (anciennement X3) et le comité ISO JTC1/SC22/WG14. L'ANSI a chargé le NCITS de créer des comités techniques pour développer des normes nationales américaines
Le J16 a été chargé en 1989 de créer une norme américaine pour le C++. Vers 1991, le WG14 a été chargé de créer un standard international. Le projet du J16 a été convertis en projet de « Type I » (international) et subordonné à l'effort de standardisation de l'ISO.
Les deux comités se réunissent en même temps au même endroit, et la voix du J16 constitue le vote américain au WG14. Le WG14 délègue le travail technique au J16. Le WG14 vote sur le travail technique du J16.
Le standard C++ a été créé à l'origine comme un standard ISO. L'ANSI a plus tard choisi (comme le recommandait le J16) d'adopter le C++ standard ISO comme norme américaine pour le C++.
Ainsi, l'« ISO » est la manière exacte de se référer au standard C++.
I-H-1. Support du langage▲
Votre compilateur peut ne pas supporter toutes les fonctionnalités traitées dans ce livre, particulièrement si vous n'en avez pas la version la plus récente. Implémenter un langage comme le C++ est une tâche herculéenne, et vous pouvez vous attendre à ce que les fonctionnalités apparaissent par petits bouts plutôt que toutes en même temps. Mais si vous essayez un des exemples du livre et obtenez beaucoup d'erreurs du compilateur, ce n'est pas nécessairement un bug du code ou du compilateur ; c'est peut-être simplement que ça n'a pas encore été implémenté sur votre propre compilateur.
I-I. Le CD-ROM du livre▲
Le contenu principal du CD-ROM fourni à la fin de ce livre est une « conférence sur CD-ROM » intitulée Penser en C : Bases pour Java et C++ par Chuck Allison (édité par MindView, Inc., et aussi disponible sans limitation sur www.BruceEckel.com). Il contient de nombreuses heures de conférences audio et des présentations, et peut être consulté sur la plupart des ordinateurs si vous avez un lecteur de CD-ROM et une carte son.
L'objectif de Penser en C est de vous emmener prudemment à travers les principes fondamentaux du langage C. Il se concentre sur les connaissances nécessaires pour vous permettre de passer aux langages C++ ou Java, au lieu d'essayer de faire de vous un expert de tous les points sombres du C. (Une des raisons d'utiliser un langage de haut niveau comme le C++ ou le Java est justement d'éviter plusieurs de ces points sombres.) Il contient aussi des exercices et des réponses guidées. Gardez à l'esprit que parce que le chapitre 3 de ce livre surpasse le CD Penser en C, le CD ne se substitue pas à ce chapitre, mais devrait plutôt être utilisé comme une préparation à ce livre.
Merci de noter que le CD-ROM est basé sur les navigateurs, vous devez donc avoir un navigateur Internet installé avant de l'utiliser.
I-J. CD-ROM, conférences, et consultations▲
Des conférences sur CD-ROM sont prévues pour couvrir les volumes 1 et 2 de ce livre. Elles comprennent de nombreuses heures de mes conférences audio qui accompagnent des présentations qui couvrent un domaine sélectionné de chaque chapitre du livre. Elles peuvent être consultées sur la plupart des ordinateurs si vous avez un lecteur de CD-ROM et une carte son. Ces CD peuvent être achetés sur www.BruceEckel.com, où vous trouverez plus d'informations et d'échantillons de conférences.
Ma société, MindView, Inc., propose des conférences publiques de formation pratique basées sur le contenu de ce livre et également sur des sujets avancés. Le domaine sélectionné de chaque chapitre représente une leçon, qui est suivie par des exercices assistés, de manière à ce que chaque étudiant reçoive une attention personnalisée. Nous assurons également des formations internes, des consultations, des tutelles et des analyses de design et de code. Les informations et les formulaires d'inscription aux prochaines conférences et toute autre information de contact peuvent être trouvés sur www.BruceEckel.com.
Je suis parfois disponible pour de la consultation de conception, de l'évaluation de projet et des analyses de code. Quand j'ai commencé à écrire au sujet des ordinateurs, ma principale motivation était d'augmenter mes activités de consultant, parce que je trouve que le conseil est stimulant, éducatif, et une de mes expériences professionnelles les plus agréables. Ainsi, je ferai de mon mieux pour vous loger dans mon agenda, ou pour vous fournir un de mes associés (qui sont des personnes que je connais bien et en qui j'ai confiance, et souvent des personnes qui codéveloppent et présentent les conférences avec moi).
I-K. Erreurs▲
Peu importe le nombre d'astuces utilisées par un écrivain pour détecter les erreurs, certaines vont toujours s'introduire dans le texte et sauteront aux yeux d'un lecteur différent. Si vous découvrez quelque chose qui vous semble être une erreur, utilisez, s'il vous plaît, le formulaire de corrections que vous trouverez sur le site www.BruceEckel.com. Votre aide est appréciée.
I-L. À propos de la couverture▲
La première édition de ce livre avait mon visage sur la couverture, mais j'ai souhaité dès le début avoir pour la seconde édition une couverture qui serait plus une œuvre d'art, comme la couverture de Penser en Java. Pour certaines raisons, le C++ me semble suggérer l'Art Déco avec ses courbes simples et ses chromes brossés. J'avais à l'esprit quelque chose comme ces affiches de bateaux et d'avions aux longs corps étendus.
Mon ami Daniel Will-Harris ( www.Will-Harris.com), que j'ai rencontré pour la première fois dans la chorale junior du lycée, a continué pour devenir un excellent dessinateur et auteur. Il a fait pratiquement tous mes dessins, y compris la couverture pour la première édition de ce livre. Pendant le processus de conception de couverture, Daniel, mécontent des progrès que nous faisions, continuait à demander « Comment cela relie-t-il les personnes aux ordinateurs ? » nous étions coincés.
Sur un caprice, sans idée particulière à l'esprit, il m'a demandé de mettre mon visage sur le scanner. Daniel a fait « autotracer » le scan de mon visage par un de ses logiciels graphiques (Corel Xara, son favori). Comme il le décrit, « Autotracer est la manière de l'ordinateur de transformer une image en lignes et courbes qui y ressemblent vraiment. » Il a alors joué avec ça jusqu'à ce qu'il obtienne un résultat qui ressemble à une carte topographique de mon visage, une image qui pourrait être la façon dont un ordinateur pourrait voir les personnes.
J'ai pris cette image et l'ai photocopiée sur du papier aquarelle (certains copieurs couleur peuvent manipuler des papiers épais), et j'ai alors commencé à faire de nombreuses expériences en ajoutant de l'aquarelle à l'image. Nous avons choisi nos préférées, et Daniel les a de nouveau scannées et arrangées sur la couverture, ajoutant le texte et les autres composants graphiques. Le processus complet s'est déroulé sur plusieurs mois, principalement à cause du temps qu'il m'a fallu pour les aquarelles. Mais je l'ai particulièrement apprécié parce que j'ai pu participer à l'art sur la couverture, et parce que ça m'a encouragé à faire plus d'aquarelles (ce qu'ils disent à propos de la pratique est réellement vrai).
I-M. Conception et production du livre▲
Le design intérieur du livre a été conçu par Daniel Will-Harris, qui avait l'habitude de jouer avec des lettres décalcomanies au lycée tandis qu'il attendait l'invention des ordinateurs et de la microédition. Cependant, j'ai produit la version imprimable moi-même, ainsi les erreurs de composition sont miennes. Microsoft Word versions 8 et 9 pour Windows ont été utilisé pour écrire ce livre et créer la version imprimable, ainsi que pour générer la table des matières et l'index. (J'ai créé un serveur d'automation COM en Python, appelé depuis les macros VBA de Word, pour m'aider dans l'indexation.) Python (voir www.Python.org) a été employé pour créer certains des outils pour vérifier le code, et aurait été employé pour l'outil d'extraction de code si je l'avais découvert plus tôt.
J'ai créé les diagrammes avec Visio - merci à Visio Corporation d’avoir créé cet outil très utile.
La police du corps est Georgia et celle des titres est Verdana. La version imprimable finale a été produite avec Adobe Acrobat 4 et imprimée directement à partir de ce fichier - merci beaucoup à Adobe pour avoir créé un outil qui autorise l'envoi par mail des documents d'impression, cela permettant de faire en une journée de multiples révisions plutôt que de devoir compter sur mon imprimante laser et les services express de nuit. (Nous avons tout d'abord essayé le procédé d'Acrobat sur Thinking in Java, et j'ai pu uploader la version finale de ce livre à l'imprimeur aux États-Unis depuis l'Afrique du Sud.)
La version HTML a été créée en exportant le document WORD en RTF, puis en utilisant RTF2HTML (voir http://www.sunpack.com/RTF/) pour faire la majeure partie du travail de conversion HTML. (merci à Chris Hector d’avoir conçu un outil aussi utile et particulièrement fiable.) Les fichiers résultants ont été nettoyés grâce à un programme que j'ai mis au point en mélangeant plusieurs programmes Python, et les WMF ont été convertis en GIF avec JASC PaintShop Pro 6 et son outil de traitement des conversions (merci à JASC d’avoir résolu tant de problèmes pour moi avec leur excellent produit). La coloration syntaxique a été ajoutée via un script Perl, contribution généreuse de Zafir Anjum.
I-N. Remerciements▲
Tout d'abord merci à tous ceux sur Internet qui ont soumis leurs corrections et leurs suggestions; vous avez été très utiles en améliorant la qualité de ce livre, et je n'aurais pas pu le faire sans vous. Remerciements tout particuliers à John Cook.
Les idées et la compréhensibilité dans ce livre sont le fait de beaucoup de sources : des amis comme Chuck Allison, Andrea Provaglio, Dan Saks, Scott Meyers, Charles Petzold, et Michael Wilk; des pionniers du langage comme Bjarne Stroustrup, Andrew Koenig, et Rob Murray; des membres du Comité de Standardisation du C++ comme Nathan Myers (qui a été particulièrement salutaire et généreux de sa perspicacité), Bill Plauger, Reg Charney, Tom Penello, Tom Plum, Sam Druker, et Uwe Steinmueller; des personnes qui sont intervenues pendant ma présentation à la Conférence sur le Développement Logiciel; et souvent des étudiants qui, pendant mes séminaires, ont posé les questions que j'avais besoin d'entendre afin de rendre les choses plus claires.
Un énorme merci à mon amie Gen Kiyooka, dont la compagnie - Digigami - m'a fourni un serveur Web.
Mon ami Richard Hale Shaw et moi avons enseigné le C++ ensemble; la perspicacité de Richard et son soutien ont été très utiles (ainsi que celle de Kim). Merci également à KoAnn Vikoren, Eric Faurot, Jennifer Jessup, Tara Arrowood, Marco Pardi, Nicole Freeman, Barbara Hanscome, Regina Ridley, Alex Dunne, et le reste des membres de l'équipe de MFI.
Un remerciement spécial à tous mes professeurs et tous mes étudiants (qui sont également mes professeurs).
Et pour les auteurs préférés, mes profondes appréciation et sympathie pour vos efforts : John Irving, Neal Stephenson, Robertson Davies (vous nous manquez beaucoup), Tom Robbins, William Gibson, Richard Bach, Carlos Castaneda, et Gene Wolfe.
À Guido van Rossum, pour avoir inventé Python et l'avoir offert au monde. Vous avez enrichi ma vie avec votre contribution.
Merci à tout le personnel de Prentice Hall : Alan Apt, Ana Terry, Scott Disanno, Toni Holm, et ma rédactrice électronique (???) Stephanie English. Pour le marketing, Bryan Gambrel et Jennie Burger.
Sonda Donovan qui m'a aidé pour la réalisation du CD-ROM. Daniel Will-Harris (bien sûr) qui a créé la sérigraphie du disque lui-même.
À toutes les grandes gens de Crested Butte, merci pour en avoir fait un lieu magique, spécialement à Al Smith (créateur du merveilleux Camp4 Coffee Garden), mes voisins Dave et Erika, Marsha de la librairie de la place Heg, Pat et John de Teocalli Tamale, Sam de la boulangerie-café et Tiller pour son aide avec les recherches audio. Et à toutes les personnes géniales qui traînent à Camp4 et rendent mes matinées intéressantes.
La troupe d'amis supporters inclut, mais n'est pas limitée à eux, Zack Urlocker, Andrew Binstock, Neil Rubenking, Kraig Brockschmidt, Steve Sinofsky, JD Hildebrandt, Brian McElhinney, Brinkley Barr, Larry O'Brien, Bill Gates au Midnight Engineering Magazine, Larry Constantine, Lucy Lockwood, Tom Keffer, Dan Putterman, Gene Wang, Dave Mayer, David Intersimone, Claire Sawyers, les Italiens(Andrea Provaglio, Rossella Gioia, Laura Fallai, Marco et Lella Cantu, Corrado, Ilsa and Christina Giustozzi), Chris et Laura Strand (et Parker), les Almquist, Brad Jerbic, Marilyn Cvitanic, les Mabry, les Haflinger, les Pollock, Peter Vinci, les Robbin, les Moelter, Dave Stoner, Laurie Adams, les Cranston, Larry Fogg, Mike and Karen Sequeira, Gary Entsminger et Allison Brody, Kevin, Sonda, et Ella Donovan, Chester et Shannon Andersen, Joe Lordi, Dave et Brenda Bartlett, les Rentschler, Lynn et Todd, et leurs familles. Et bien sûr Maman et Papa.