467
Penser en C++ Volume 1 par Bruce Eckel Date de publication : 27/08/2008 Dernière mise à jour : 27/08/2008 Ce cours est une traduction du livre Thinking in C++de Bruce Eckel, dont l'original est disponible ici : [lien].

Penser en C

Embed Size (px)

Citation preview

Penser en C++Volume 1 par Bruce Eckel

Date de publication : 27/08/2008 Dernire mise jour : 27/08/2008

Ce cours est une traduction du livre Thinking in C++de Bruce Eckel, dont l'original est disponible ici : [lien].

Penser en C++ par Bruce Eckel

0 - Prface 0.1 - Quoi de neuf dans cette seconde dition ? 0.1.1 - Qu'y a-t-il dans le Volume 2 de ce livre ? 0.1.2 - Comment rcuprer le Volume 2 ? 0.2 - Prrequis 0.3 - Apprendre le C++ 0.4 - Buts 0.5 - Chapitres 0.6 - Exercices 0.6.1 - Solutions des exercices 0.7 - Le Code Source 0.8 - Normes du langage 0.8.1 - Support du langage 0.9 - Le CD ROM du livre 0.10 - CD ROMs, confrences, et consultations 0.11 - Erreurs 0.12 - A propos de la couverture 0.13 - Conception et production du livre 0.14 - Remerciements 1 - Introduction sur les Objets 1.1 - Les bienfaits de l'abstraction 1.2 - Un objet dispose d'une interface 1.3 - L'implmentation cache 1.4 - Rutilisation de l'implmentation 1.5 - Hritage : rutilisation de l'interface 1.5.1 - Les relations est-un vs. est-comme-un 1.6 - Polymorphisme : des objets interchangeables 1.7 - Crer et dtruire les objets 1.8 - Traitement des exceptions : grer les erreurs 1.9 - Analyse et conception 1.9.1 - Phase 0 : Faire un plan 1.9.2 - Phase 1 : Que construit-on ? 1.9.3 - Phase 2 : Comment allons-nous le construire ? 1.9.4 - Phase 3 : Construire le coeur du systme 1.9.5 - Phase 4 : Itrer sur les cas d'utilisation 1.9.6 - Phase 5 : Evolution 1.9.7 - Les plans sont payants 1.10 - Extreme programming 1.10.1 - Commencer par crire les tests 1.10.2 - Programmation en binme 1.11 - Les raisons du succs du C++ 1.11.1 - Un meilleur C 1.11.2 - Vous tes dj sur la courbe d'apprentissage. 1.11.3 - Efficacit 1.11.4 - Les systmes sont plus faciles exprimer et comprendre 1.11.5 - Puissance maximale grce aux bibliothques 1.11.6 - Rutilisation des sources avec les templates 1.11.7 - Traitement des erreurs 1.11.8 - Mise en oeuvre de gros projets 1.12 - Stratgies de transition 1.12.1 - Les grandes lignes 1.12.2 - Ecueils de la gestion 1.13 - Rsum 2 - Construire et utiliser les objets-2Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

2.1 - Le processus de traduction du langage 2.1.1 - Les interprteurs 2.1.2 - Les compilateurs 2.1.3 - Le processus de compilation 2.2 - Outils de compilation spare 2.2.1 - Dclarations vs. dfinitions 2.2.2 - Edition des liens 2.2.3 - Utilisation des bibliothques 2.3 - Votre premier programme C++ 2.3.1 - Utilisation de la classe iostream 2.3.2 - Espaces de noms 2.3.3 - Principes fondamentaux de structure de programme 2.3.4 - "Bonjour tout le monde !" 2.3.5 - Lancer le compilateur 2.4 - Plus sur les flux d'entre-sortie 2.4.1 - Concatnation de tableaux de caractres 2.4.2 - Lire les entres 2.4.3 - Appeler d'autres programmes 2.5 - Introduction aux chanes de caractres 2.6 - Lire et crire des fichiers 2.7 - Intoduction la classe vector 2.8 - Rsum 2.9 - Exercices 3 - Le C de C++ 3.1 - Cration de fonctions 3.1.1 - Valeurs de retour des fonctions 3.1.2 - Utilisation de la bibliothque de fonctions du C 3.1.3 - Crer vos propres bibliothques avec le bibliothcaire 3.2 - Contrle de l'excution 3.2.1 - Vrai et faux 3.2.2 - if-else 3.2.3 - while 3.2.4 - do-while 3.2.5 - for 3.2.6 - Les mots cl break et continue 3.2.7 - switch 3.2.8 - Du bon et du mauvais usage du goto 3.2.9 - Rcursion 3.3 - Introduction aux operateurs 3.3.1 - Priorit 3.3.2 - Auto incrmentation et dcrmentation 3.4 - Introduction aux types de donnes 3.4.1 - Types intgrs de base 3.4.2 - bool, true, & false 3.4.3 - Spcificateurs 3.4.4 - Introduction aux pointeurs 3.4.5 - Modification d'objets extrieurs 3.4.6 - Introduction aux rfrences en C++ 3.4.7 - Pointeurs et rfrences comme modificateurs 3.5 - Porte des variables 3.6 - Dfinir des variables " la vole" 3.6 - Dfinir l'allocation mmoire 3.6.1 - Variables globales 3.6.2 - Variables locales 3.6.3 - static

-3Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

3.6.4 - extern 3.6.5 - Constantes 3.6.6 - volatile 3.7 - Operateurs et leurs usages 3.7.1 - L'affectation 3.7.2 - Oprateurs mathmatiques 3.7.3 - Oprateurs relationnels 3.7.4 - Oprateurs logiques 3.7.5 - Oprateurs bit bit 3.7.6 - Oprateurs de dcalage 3.7.7 - Oprateurs unaires 3.7.8 - L'oprateur ternaire 3.7.9 - L'oprateur virgule 3.7.10 - Pige classique quand on utilise les oprateurs 3.7.11 - Oprateurs de transtypage 3.7.12 - Transtypage C++ explicite 3.7.13 - sizeof Un oprateur par lui mme 3.7.14 - Le mot clef asm 3.7.15 - Oprateurs explicites 3.8 - Cration de type composite 3.8.1 - Alias de noms avec typedef 3.8.2 - Combiner des variables avec des struct 3.8.3 - Eclaircir les programmes avec des enum 3.8.4 - Economiser de la mmoire avec union 3.8.5 - Tableaux 3.9 - Conseils de dboguage 3.9.1 - Drapeaux de dboguage 3.9.2 - Transformer des variables et des expressions en chanes de caractre 3.9.3 - la macro C assert( ) 3.10 - Adresses de fonctions 3.10.1 - Dfinir un pointeur de fonction 3.10.2 - Dclarations complexes & dfinitions 3.10.3 - Utiliser un pointeur de fonction 3.10.4 - Tableau de pointeurs de fonction 3.11 - Make: gestion de la compilation spare 3.11.1 - Les actions du Make 3.11.2 - Les makefiles de ce livre 3.11.3 - Un exemple de makefile 3.12 - Rsum 3.13 - Exercices 4 - Abstraction des donnes 4.1 - Une petite bibliothque dans le style C 4.1.1 - Allocation dynamique de mmoire 4.1.2 - Mauvaises conjectures 4.2 - Qu'est-ce qui ne va pas? 4.3 - L'objet de base 4.4 - Qu'est-ce qu'un objet? 4.5 - Typage de donnes abstraites 4.6 - Dtails sur les objest 4.7 - L'tiquette d'un fichier d'en-tte 4.7.1 - L'importance des fichiers d'en-tte 4.7.2 - Le problme des dclarations multiples 4.7.3 - Les directives #define, #ifdef et #endif du prprocesseur 4.7.4 - Un standard pour les fichiers d'en-tte 4.7.5 - Les espaces de nommage dans les fichiers d'en-tte

-4Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

4.7.6 - Utiliser des fichiers d'en-tte dans des projets 4.8 - Structures imbriques 4.8.1 - Rsolution de porte globale 4.9 - Rsum 4.10 - Exercices 5 - Cacher l'implmentation 5.1 - Fixer des limites 5.2 - Le contrle d'accs en C++ 5.2.1 - protected 5.3 - L'amiti 5.3.1 - Amis embots 5.3.2 - Est-ce pur ? 5.4 - Organisation physique d'un objet 5.5 - La classe 5.5.1 - Modifier Stash pour employer le contrle d'accs 5.5.2 - Modifier Stack pour employer le contrle d'accs 5.6 - Manipuler les classes 5.6.1 - Dissimuler l'implmentation 5.6.2 - Rduire la recompilation 5.7 - Rsum 5.8 - Exercices 6 - Initialisation & Nettoyage 6.1 - Initialisation garantie avec le constructeur 6.2 - Garantir le nettoyage avec le destructeur 6.3 - Elimination de la dfinition de bloc 6.3.1 - les boucles 6.3.2 - Allocation de mmoire 6.4 - Stash avec constructueur et destructeur 6.5 - Stack avec des constructeurs & des destructeurs 6.6 - Initialisation d'aggrgat 6.7 - Les constructeurs par dfaut 6.8 - Rsum 6.9 - Exercices 7 - Fonctions surcharge et arguments par dfaut 7.1 - Plus sur les dcorations de nom 7.1.1 - Valeur de retour surcharge : 7.1.2 - Edition de liens scurise 7.2 - Exemple de surchargement 7.3 - unions 7.4 - Les arguments par dfaut 7.4.1 - Paramtre fictif 7.5 - Choix entre surcharge et arguments par dfaut 7.6 - Rsum 7.7 - Exercices 8 - Constantes 8.1 - Substitution de valeurs 8.2 - Les pointeurs 8.2.1 - Pointeur vers const 8.2.2 - Pointeur const 8.2.3 - Assignation et vrification de type 8.3 - Arguments d'une fonction & valeurs retournes 8.3.1 - Passer par valeur const 8.3.2 - Retour par valeur const 8.3.3 - Passer et retourner des adresses 8.4 - Classes

-5Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

8.4.1 - const dans les classes 8.4.2 - Constantes de compilation dans les classes 8.4.3 - objets cont & fonctions membres 8.5 - volatile 8.6 - Rsum 8.7 - Exercices 9 - Fonctions inlines 9.1 - Ecueils du prprocesseurs 9.1.1 - Les macros et l'accs 9.2 - Fonctions inline 9.2.1 - Les inline dans les classes 9.2.2 - Fonctions d'accs 9.3 - Stash & Stack avec les inlines 9.4 - Les inline & le compilateur 9.4.1 - Limitations 9.4.2 - Dclarations aval 9.4.3 - Activits caches dans les constructeurs et les destructeurs 9.5 - Rduire le fouillis 9.6 - Caractristiques supplmentaires du prprocesseur 9.6.1 - Collage de jeton 9.7 - Vrification d'erreurs amliore 9.8 - Rsum 9.9 - Exercices 10 - Contrle du nom 10.1 - Elments statiques issus du C 10.1.1 - Variables statiques l'intrieur des fonctions 10.1.2 - Contrle de l'dition de liens 10.1.3 - Autre spcificateurs de classe de stockage 10.2 - Les namespaces 10.2.1 - Crer un espace de nommage 10.2.2 - Utiliser un espace de nommage 10.2.3 - L'utilisation des espace de nommage 10.3 - Membres statiques en C++ 10.3.1 - Dfinir le stockage pour les donnes membres statiques 10.3.2 - Classes imbriques et locales 10.3.3 - Fonctions membres statiques 10.4 - Dpendance de l'initialisation statique 10.4.1 - Que faire 10.5 - Spcification alternative des conventions de liens 10.6 - Sommaire 10.7 - Exercices 11 - Rfrences & le constructeur de copie 11.1 - Les pointeurs en C++ 11.2 - Les rfrences en C++ 11.2.1 - Les rfrences dans les fonctions 11.2.2 - Indications sur le passage d'arguments 11.3 - Le constructeur par recopie 11.3.1 - Passer & renvoyer par valeur 11.3.2 - Construction par recopie 11.3.3 - Constructeur par recopie par dfaut 11.3.4 - Alternatives la construction par recopie 11.4 - Pointeurs sur membre 11.4.1 - Fonctions 11.5 - Rsum 11.6 - Exercices

-6Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

12 - Surcharges d'oprateurs 12.1 - Soyez avertis et rassurs 12.2 - Syntaxe 12.3 - Oprateurs surchargeables 12.3.1 - Oprateurs unaires 12.3.2 - Oprateurs binaires 12.3.3 - Arguments & valeurs de retour 12.3.4 - oprateurs inhabituels 12.3.5 - Oprateurs que vous ne pouvez pas surcharger 12.4 - Oprateurs non membres 12.4.1 - Conseils lmentaires 12.5 - Surcharge de l'affectation 12.5.1 - Comportement de operator= 12.6 - Conversion de type automatique 12.6.1 - Conversion par constructeur 12.6.2 - Conversion par oprateur 12.6.3 - Exemple de conversion de type 12.6.4 - Les piges de la conversion de type automatique 12.7 - Rsum 12.8 - Exercices 13 - Cration d'Objets Dynamiques 13.1 - Cration d'objets 13.1.1 - L'approche du C au tas 13.1.2 - l'operateur new 13.1.3 - l'oprateur delete 13.1.4 - Un exemple simple 13.1.5 - Le surcot du gestionnaire de mmoire 13.2 - Exemples prcdents revus 13.2.1 - detruire un void* est probablement une erreur 13.2.2 - La responsabilit du nettoyage avec les pointeurs 13.2.3 - Stash pour des pointeurs 13.3 - new & delete pour les tableaux 13.3.1 - Rendre un pointeur plus semblable un tableau 13.4 - Manquer d'espace de stockage 13.5 - Surcharger new & delete 13.5.1 - La surcharge globale de new & delete 13.5.2 - Surcharger new & delete pour une classe 13.5.3 - Surcharger new & delete pour les tableaux 13.5.4 - Appels au constructeur 13.5.5 - new & delete de placement 13.6 - Rsum 13.7 - Exercices 14 - Hritage & composition 14.1 - Syntaxe de la composition 14.2 - Syntaxe de l'hritage 14.3 - La liste d'initialisation du construteur 14.3.1 - Initialisation d'un objet membre 14.3.2 - Types prdfinis dans la liste d'initialisation 14.4 - Combiner composition & hritage 14.4.1 - Ordre des appels des constructeurs & et des destructeurs 14.5 - Masquage de nom 14.6 - Fonctions qui ne s'hritent pas automatiquement 14.6.1 - Hritage et fonctions membres statiques 14.7 - Choisir entre composition et hritage 14.7.1 - Sous-typer

-7Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

14.7.2 - hritage priv 14.8 - protected 14.8.1 - hritage protg 14.9 - Surcharge d'oprateur & hritage 14.10 - Hritage multiple 14.11 - Dveloppement incrmental 14.12 - Transtypage ascendant 14.12.1 - Pourquoi "ascendant" ? 14.12.2 - Le transtypage ascendant et le constructeur de copie 14.12.3 - Composition vs. hritage (rvis) 14.12.4 - Transtypage ascendant de pointeur & de reference 14.12.5 - Une crise 14.13 - Rsum 14.14 - Exercices 15 - Polymorphisme & Fonctions Virtuelles 15.1 - Evolution des programmeurs C++ 15.2 - Transtypage ascendant ( upcasting) 15.3 - Le problme 15.3.1 - Liaison d'appel de fonction 15.4 - Fonctions virtuelles 15.4.1 - Extensibilit 15.5 - Comment le C++ implmente la liaison tardive 15.5.1 - Stocker l'information de type 15.5.2 - Reprsenter les fonntions virtuelles 15.5.3 - Sous le capot 15.5.4 - Installer le vpointeur 15.5.5 - Les objets sont diffrents 15.6 - Pourquoi les fonctions virtuelles ? 15.7 - Classes de base abstraites et fonctions virtuelles pures 15.7.1 - Dfinitions virtuelles pures 15.8 - L'hritage et la VTABLE 15.8.1 - Dcoupage d'objets en tranches 15.9 - Surcharge & redfinition 15.9.1 - Type de retour covariant 15.10 - Fonctions virtuelles & constructeurs 15.10.1 - Ordre des appels au constructeur 15.10.2 - Comportement des fonctions virtuelles dans les constructeurs 15.11 - Destructeurs et destructeurs virtuels 15.11.1 - Destructeurs virtuels purs 15.11.2 - Les virtuels dans les destructeurs 15.11.3 - Crer une hirarchie base sur objet 15.12 - Surcharge d'oprateur 15.13 - Transtypage descendant 15.14 - Rsum 15.15 - Exercices 16 - Introduction aux Templates 16.1 - Les conteneurs 16.1.1 - Le besoin de conteneurs 16.2 - Survol des templates 16.2.1 - La solution template 16.3 - Syntaxe des templates 16.3.1 - Dfinitions de fonctions non inline 16.3.2 - IntStack comme template 16.3.3 - Constantes dans les templates 16.4 - Stack et Stash comme templates

-8Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

16.4.1 - Pointeur Stash modlis 16.5 - Activer et dsactiver la possession 16.6 - Stocker des objets par valeur 16.7 - Prsentation des itrateurs 16.7.1 - Stack avec itrateurs 16.7.2 - PStash avec les iterateurs 16.8 - Pourquoi les itrateurs ? 16.8.1 - Les templates de fonction 16.9 - Rsum 16.10 - Exercices 17 - A: Le style de codage 18 - B: Directives de programmation 19 - C: Lectures recommandes 19.1 - C 19.2 - C++ en gnral 19.2.1 - Ma propre liste de livres 19.3 - Profondeurs et recoins 19.4 - Analyse & conception 20 - Copyright et traduction 20.1 - Pour la version anglaise : 20.2 - Pour la version franaise : 20.2.1 - Equipe de traduction : 20.2.2 - Relecteurs 20.2.3 - Mise en place du projet

-9Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

0 - PrfaceComme n'importe quel langage humain, le C++ permet d'exprimer des concepts. S'il est russi, ce support d'expression sera plus simple et plus flexible que les solutions alternatives, qui au fur et mesure que les problmes s'amplifient, deviennent plus complexes. On ne peut pas simplement considrer le C++ comme un ensemble de fonctionnalits - certaines fonctionnalits 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 faon, il faut comprendre les problmes lis au C et la programmation en gnral. Ce livre traite des problmes de programmation, pourquoi ce sont des problmes, et l'approche que le C++ a prise pour rsoudre de tels problmes. Ainsi, le groupe de fonctionnalits que je traite dans chaque chapitre sera organis selon la faon que j'ai de voir comment le langage rsout un type particulier de problme. De cette manire j'espre vous amener, au fur et mesure, depuis la comprhension du C jusqu'au point o la mentalit C++ devient une seconde nature. Du dbut la fin, j'adopterai l'attitude selon laquelle vous voulez construire un modle dans votre tte qui vous permettra de comprendre le langage jusque dans ses moindres dtails - si vous avez affaire un puzzle, vous serez capable de l'assembler selon votre modle et d'en dduire la rponse. J'essayerai de vous transmettre les ides qui ont rarrang mon cerveau pour me faire commencer penser en C++.

0.1 - Quoi de neuf dans cette seconde dition ?Ce livre est une rcriture complte de la premire dition pour reflter tous les changements introduits dans le langage C++ par la finalisation du standard C++, et pour reflter galement ce que j'ai appris depuis l'criture de la premire dition. L'ensemble du texte prsent dans la premire dition a t examin et rcrit, 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 rarrangement et un nouveau classement significatif du document ont eu lieu afin de rpercuter la disponibilit de meilleurs outils et ma meilleure apprhension de la faon dont les gens apprennent le C++. Un nouveau chapitre a t ajout, rapide introduction aux concepts du C et aux fonctionnalits de base du C++, pour ceux qui n'ont pas l'exprience du C pour aborder le reste du livre. Le CD ROM reli au dos du livre contient une confrence qui est une introduction encore plus douce aux concepts du C ncessaires pour comprendre le C++ (ou le Java). Elle a t cre par Chuck Allison pour ma socit (MindView, Inc.), et est appele "Penser en C : Bases pour Java et C++." Elle vous prsente les aspects du C ncessaires pour passer au C++ ou Java, en laissant de ct les parties difficiles auxquelles les programmeurs C sont confronts 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 rponse courte la question "Qu'est-ce qui est nouveau dans la deuxime dition ?" est : ce qui n'est pas nouveau a t rcrit, parfois tel point que vous ne reconnaitrez pas les exemples et le contenu d'origine.

0.1.1 - Qu'y a-t-il dans le Volume 2 de ce livre ?L'achvement du standard C++ a galement ajout un certain nombre de nouvelles bibliothques importantes, comme les chanes de caractres ( string) et les conteneurs et algorithmes de la bibliothque standard du C++, aussi bien que la nouvelle complexit des templates. Ces nouveauts et d'autres sujets plus avancs ont t relgus au volume 2 de ce livre, y compris des problmes tels l'hritage multiple, la gestion des exceptions, les modles de conception, et les sujets sur les systmes stables de compilation et de dbogage.

0.1.2 - Comment rcuprer le Volume 2 ?

- 10 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

Tout comme le livre que vous tenez actuellement, Penser en C++, Volume 2est en tlchargement dans sa totalit sur mon site Web www.BruceEckel.com. Vous pouvez trouver la date d'impression prvue 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 confrences-sur-CD ROM proposes par MindView, Inc., des confrences publiques, et des formations, consultations, tutelles, et visites internes.

0.2 - PrrequisDans la premire 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, prsent avec le CD du sminaire Penser en C, mais je considre toujours que vous avez dj une certaine exprience en programmation. En outre, de mme 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.

0.3 - Apprendre le C++J'ai suivi le mme cheminement vers le C++ que les lecteurs de ce livre: avec une attidude trs pragmatique envers la programmation, trs "dtails pratiques". Pire, mon pass et mon exprience taient tourns vers la programmation embarque niveau matriel, dans laquelle le C tait souvent considr comme un langage de haut-niveau et d'une surpuissance inefficace pour dplacer des bits. J'ai dcouvert plus tard que je n'tais pas vraiment un trs bon programmeur C, cachant mon ignorance des structures, malloc( )et free( ), setjmp( )et longjmp( ), et autres concepts "sophistiqus", 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 dcent tait l'autoproclam "Guide de l'expert, Bjarne Stroustrup, The C++ Programming Language, Addison-Wesley, 1986 (premire dition).", de Bjarne Stroustrup, et j'tais donc livr moi-mme pour simplifier les concepts de base. Ceci a eu comme consquence mon premier livre sur le C++, Using C++, Osborne/McGraw-Hill 1989.ce qui tait essentiellement une extraction crbrale de mon exprience. Il a t conu comme un guide pour le lecteur afin d'introduire les programmeurs en mme temps au C et au C++. Les deux ditions Using C++ et C++ Inside & Out, Osborne/McGraw-Hill 1993.du livre ont entran une raction enthousiaste. Pratiquement en mme temps que la sortie de Using C++, j'ai commenc enseigner le langage dans des confrences et des prsentations. Enseigner le C++ (et plus tard le Java) est devenu ma profession ; j'ai vu des ttes penches, des visages livides, et des expressions embarrasses dans les assistances partout dans le monde depuis 1989. Alors que je commenais donner des formations internes de plus petits groupes de personnes, j'ai dcouvert une chose pendant les exercices. Mmes ces personnes qui souriaient et acquiesaient taient perdues devant de nombreux problmes. J'ai dcouvert, en crant et prsidant pendant de nombreuses annes les sujets C++ et Java la confrence sur le dveloppement logiciel, que les intervenants (moi compris) avaient tendance prsenter au public type trop de sujets trop rapidement. Ainsi en dfinitive, du fait de la diversit des niveaux de l'assistance et de la manire dont j'ai prsent le contenu, je finissais par perdre une partie du public. Peut-tre est-ce trop demander, mais comme je suis une de ces personnes rfractaire aux cours traditionnels (et pour beaucoup, je crois, une telle rsistance est gnre par l'ennui), j'ai voulu essayer de garder tout le monde dans le rythme. Pendant quelques temps, j'ai cr un certain nombre de prsentations diffrentes dans un ordre assez court. Ainsi, j'ai fini par apprendre par exprience et itration (une technique qui fonctionne galement bien dans la conception de programmes C++). Par la suite, j'ai dvelopp un cours en utilisant tout ce que j'avais appris de mon exprience d'enseignement. Il aborde le problme de l'apprentissage par des tapes distinctes, faciles digrer, et pour

- 11 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

impliquer l'auditoire (situation d'apprentissage idale), des exercices suivent chacune des prsentations. Vous pouvez dcouvrir mes confrences publiques sur www.BruceEckel.com, et vous pouvez galement vous y renseigner sur les confrences que j'ai publi en CD ROM. La premire dition de ce livre s'est dveloppe dans un cheminement de deux ans, et le contenu de ce livre a t test en situation dans beaucoup de formes dans de nombreuses confrences. Le retour que j'ai peru de chaque confrence 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 confrence ; 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 tout autre chose, le livre est conu pour servir le lecteur solitaire qui lutte avec un nouveau langage de programmation.

0.4 - ButsDans ce livre je me suis donn comme buts : 1 2 Prsenter 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 dtournera des problmes du monde rel , mais j'ai remarqu que les dbutants sont gnralement plus satisfaits de comprendre chaque dtail d'un exemple qu'ils ne sont impressionns par la porte du problme qu'il rsout. Il y a galement une limite la taille du code qui peut tre assimil dans une situation de cours magistral, limite qu'il faut imprativement ne pas dpasser. A ce sujet je reois parfois des critiques pour avoir utilis des exemples jouets , et je les accepte volontiers, avec le prtexte que ce que je prsente est utile, pdagogiquement parlant. Enchaner soigneusement la prsentation des fonctionnalits 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 brve description en introduction. Montrer ce que je pense tre important concernant la comprhension du langage, plutt qu'exposer tout mon savoir. Je crois que l'information est fortement hirarchise, qu'il est avr que 95 % des programmeurs n'ont pas besoin de tout connatre, et que cela ne ferait que les embrouiller et accrotre leur impression de complexit du langage. Pour prendre un exemple en C, en connaissant par coeur le tableau de priorit des oprateurs (ce qui n'est pas mon cas), il est possible d'crire un code astucieux. Mais si vous y rflchissez un instant, ceci risque de drouter le lecteur et/ou le mainteneur de ce code. Il est donc prfrable d'oublier la priorit des oprateurs, et d'utiliser des parenthses lorsque les choses ne sont pas claires. Une attitude similaire sera adopte avec certaines informations du langage C++, qui je pense sont plus importantes pour les ralisateurs de compilateurs que pour les programmeurs. Maintenir chaque section assez concentre de telle manire 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 sminaire, 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 particulire d'un quelconque revendeur C++ parce que, pour apprendre un langage, je ne pense pas que les dtails d'une implmentation particulire soient aussi importants que le langage lui-mme. La documentation fournie par les revendeurs au sujet de leurs propres spcificits d'implmentation est la plus part du temps suffisante.

3 4

5 6 7

0.5 - ChapitresLe C++ est un langage dans lequel des fonctionnalits nouvelles et diffrentes ont t mises en place partir d'une syntaxe existante (de ce fait, il est considr comme un langage de programmation orient objet hybride). Au fur et mesure que des gens dpassaient la phase d'apprentissage, nous avons commenc comprendre la manire dont les dveloppeurs franchissaient les tapes des fonctionnalits du langage C++. Puisque cela semblait tre la progression naturelle d'un esprit entran aux langages procduraux, j'ai dcid de comprendre et de suivre- 12 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

moi-mme ce cheminement et d'acclrer le processus en exprimant et en rpondant 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 conu ce cours en gardant une chose l'esprit : amliorer le processus d'apprentissage du C++. Les ractions de mes auditoires m'ont aid comprendre quelles parties taient difficiles et ncessitaient des claircissements particuliers. Dans les domaines dans lesquels j'ai t ambitieux et o j'ai inclus trop de fonctionnalits la fois, j'ai t amen comprendre - travers la prsentation de ces connaissances - que si vous incluez beaucoup de nouvelles fonctionnalits, vous devez toutes les expliquer, et cela gnre facilement la confusion des tudiants. En consquence, j'ai essay d'introduire le moins de fonctionnalits possibles la fois ; idalement, un concept principal par chapitre seulement. L'objectif est alors d'enseigner un unique concept pour chaque chapitre, ou un petit groupe de concepts associs, de telle faon qu'aucune fonctionnalit additionnelle ne soit requise. De cette faon, vous pouvez digrer chaque partie en fonction de vos connaissances actuelles avant de passer la suivante. Pour cela, j'ai conserv des fonctionnalits du C plus longtemps que je ne l'aurais souhait. L'avantage, c'est que vous ne serez pas perturbs par la dcouverte de fonctionnalits C++ utilises avant d'tre expliques, et votre introduction ce langage sera douce et refltera la manire dont vous l'auriez assimil si vous deviez vous dbrouiller 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 ne, avec des programmeurs disant "Nous ne pouvons pas terminer les projets, et si nous le pouvons, ils sont trop chers !". Cela a entran un certain nombre de rponses, qui sont dveloppes dans ce chapitre avec les ides de la programmation oriente objet (POO) et comment elle tente de rsoudre la crise du logiciel. Ce chapitre vous entrane travers les concepts et fonctionnalits de base de la POO et introduit galement les processus d'analyse et de conception. Par ailleurs, vous dcouvrirez les avantages et inconvnients de l'adoption du langage, ainsi que des suggestions pour entrer dans le monde du C++. Chapitre 2 : Crer et utiliser des objets. Ce chapitre explique le processus de cration de programmes utilisant des compilateurs et des bibliothques. Il introduit le premier programme C++ du livre et montre comment les programmes sont construits et compils. Des bibliothques objet de base disponibles dans le Standard C++ sont alors introduites. Lorsque vous aurez termin ce chapitre, vous aurez une bonne comprhension de ce que signifie crire un programme C++ utilisant les bibliothques objet disponibles immdiatement. Chapitre 3 : Le C dans C++. Ce chapitre est une vue d'ensemble dense des fonctionnalits du C qui sont utilises en C++, ainsi que d'un certain nombre de fonctionnalits de base disponibles uniquement en C++. Il prsente galement "make", un utilitaire commun dans le monde du dveloppement 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 procduraux comme le Pascal, le C, ou mme du Basic (tant que vous avez crit beaucoup de code dans ce langage, particulirement des fonctions). Si vous trouvez ce chapitre un peu trop dense, vous devriez commencer par la confrence Penser en Cdisponible sur le CD livr avec ce livre (et galement disponible sur www.BruceEckel.com). Chapitre 4 : Abstraction des donnes. La plupart des fonctionnalits en C++ tournent autour de la possibilit de crer de nouveaux types de donnes. Non seulement cela permet une meilleure organisation du code, mais aussi cela prpare les fondations pour des capacits plus puissantes de POO. Vous verrez comme cette ide est facilite par le simple fait de mettre des fonctions l'intrieur de structures, les dtails sur la faon de le faire, et le type de code que cela entrane. Vous apprendrez aussi la meilleure manire d'organiser votre code en fichiers d'en-tte et fichiers d'implmentation. Chapitre 5 : Masquer l'implmentation. Vous pouvez dcider que certaines donnes ou fonctions de votre structure sont inaccessible l'utilisateur de ce nouveau type en les rendant prives. Cela signifie que vous pouvez

- 13 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

sparer l'implmentation sous-jacente de l'interface que le programmeur client peut voir, et ainsi permettre de modifier facilement cette implmentation sans pour autant affecter le code du client. Le mot-cl classest galement prsent comme un moyen spcialis de description d'un nouveau type de donnes, et la signification du mot "objet" est dmystifie (c'est une variable spcialise). Chapitre 6 : Initialisation et nettoyage. Une des erreurs C les plus classiques provient de la non initialisation des variables. Le constructeurdu C++ vous permet de garantir que les variables de votre nouveau type de donnes ("les objets de votre classe") seront toujours initialises correctement. Si vos objets ncessitent aussi une certaine forme de nettoyage, vous pouvez garantir que ce nettoyage aura toujours lieu l'aide du destructeurdu C++. Chapitre 7 : Surcharge de fonctions et arguments par dfaut. C++ est prvu pour vous aider construire des projets volumineux, complexes. Tout en le faisant, vous pouvez introduire des bibliothques multiples qui utilisent les mmes noms de fonctions, et vous pouvez aussi choisir d'utiliser le mme nom avec diffrentes significations dans une bibliothque unique. C++ le facilite avec la surcharge de fonction, qui vous permet de rutiliser le mme nom de fonction tant que les listes d'arguments sont diffrentes. Les arguments par dfaut vous permettent d'appeler la mme fonction de diffrentes faons en fournissant automatiquement des valeurs par dfauts pour certains de vos arguments. Chapitre 8 : Constantes. Ce chapitre couvre les mots-cls constet volatile, qui ont des significations supplmentaires en C++, particulirement l'intrieur d'une classe. Vous apprendrez ce que signifie appliquer const la dfinition d'un pointeur. Ce chapitre vous expliquera aussi comment la signification de constvarie quand il est utilis l'intrieur ou l'extrieur des classes, et comment crer des constantes dans les classes la compilation. Chapitre 9 : Fonctions 'inline'. Les macros du prprocesseur liminent les cots d'appel de fonction, mais le prprocesseur limine aussi la vrification du type C++ valable. La fonction 'inline' apporte tous les avantages d'une macro du prprocesseur plus tous ceux d'un vritable appel de fonction. Ce chapitre explore compltement l'implmentation et l'utilisation des fonctions inline. Chapitre 10 : Contrle des noms. Crer 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 contrle des noms pour leur cration, leur visibilit, leur placement de stockage, et leurs liens. Ce chapitre vous montre comment les noms sont contrls en C++ en utilisant deux techniques. Tout d'abord, le mot-cl staticest utilis pour contrler la visibilit et les liens, et nous tudions sa signification particulire avec les classes. Une technique bien plus utile pour contrler les noms de porte globale est la fonctionnalit d' espace de nommagedu C++, qui vous permet de sparer l'espace de nom global en rgions distinctes. Chapitre 11 : Rfrences et constructeur par copie. Les pointeurs C++ fonctionnent comme les pointeurs C avec l'avantage supplmentaire d'une vrification 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++ relve la rfrence, qui laisse le compilateur grer la manipulation des adresses alors que vous utilisez la notation normale. Vous rencontrerez aussi le constructeur par copie, qui contrle la manire dont les objets sont passs par valeur en argument ou en retour de fonction. En conclusion, le pointeur-vers-membre du C++ sera clairci. Chapitre 12 : Surcharge des oprateurs. Cette fonctionnalit est parfois appele le "sucre syntaxique" ; elle vous permet d'adoucir la syntaxe d'utilisation de votre type en autorisant des oprateurs comme des appels de fonctions. Dans ce chapitre vous apprendrez que la surcharge des oprateurs est simplement un type diffrent d'appel de fonction et vous apprendrez crire le votre, en prenant en considration les utilisations parfois droutantes des arguments, des types de retour, et la dcision de faire d'un oprateur soit un membre soit un ami. Chapitre 13 : Cration dynamique des objets. Combien d'avions un systme de gestion du trafic arien devra-t-il contrler ? Combien de formes un systme de DAO ncessitera-t-il ? Dans le problme gnral de la programmation, vous ne pouvez pas connatre la quantit, la dure de vie, ou mme le type des objets requis par

- 14 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

votre programme en fonctionnement. Dans ce chapitre, vous apprendrez comment les newet les deletedu C++ rpondent d'une manire lgante ce problme en crant sans risque des objets sur le tas. Vous verrez aussi comment newet deletepeuvent tre surchargs de multiples faons, vous permettant de contrler l'allocation et la libration de la mmoire. Chapitre 14 : Hritage et composition. L'abstraction des donnes vous permet de crer de nouveaux types de toutes pices, mais avec la composition et l'hritage, vous pouvez crer de nouveaux types partir de types existants. Avec la composition, vous assemblez un nouveau type en utilisant d'autres types comme des pices, et avec l'hritage, vous crez une version plus spcifique d'un type existant. Dans ce chapitre, vous apprendrez la syntaxe, la redfinition des fonctions, et l'importance de la construction et de la destruction dans l'hritage et la composition. Chapitre 15 : Polymorphisme et fonctions virtuelles. Tout seul, vous pourriez prendre neuf mois pour dcouvrir et comprendre cette pierre angulaire de la POO. A travers des exemples courts et simples, vous verrez comment crer une famille de types avec l'hritage, et manipuler les objets de cette famille travers leur classe de base commune. Le mot-cl virtualvous permet de traiter de faon gnrique tous les objets de cette famille, ce qui signifie que la majeure partie de votre code ne reposera pas sur des informations spcifiques des types. Cela rend votre programme extensible, et la construction des programmes et la maintenance du code sont plus simples et moins coteuses. Chapitre 16 : Introduction aux modles. L'hritage et la composition vous permettent de rutiliser le code des objets, mais cela ne rsout pas tous vos besoins de rutilisation. Les modles permettent de rutiliser le code sourceen 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 bibliothques de classes conteneurs, qui sont des outils importants pour le dveloppement rapide et robuste de programmes orients objet (la bibliothque standard C++ inclus une bibliothque significative de classes conteneurs). Ce chapitre vous donne des bases compltes sur ce sujet essentiel. Des sujets supplmentaires (et plus avancs) sont disponibles dans le tome 2 de ce livre, qui peut tre tlcharg sur le site www.BruceEckel.com.

0.6 - ExercicesJe me suis aperu que des exercices sont trs utiles lors d'un sminaire pour consolider les connaissances des tudiants, on en trouvera donc un ensemble la fin de chaque chapitre. Le nombre d'exercices a t considrablement augment par rapport celui de la premire dition. Un grand nombre d'entre eux sont assez simples de sorte qu'ils peuvent tre raliss en un temps raisonnable dans le contexte d'une salle de classe, pendant que l'instructeur vrifie que tous les tudiants ont assimil le sujet de la leon. Quelques exercices sont plus pointus, afin d'viter l'ennui chez les tudiants expriments. La majeure partie des exercices sont conus pour tre raliss rapidement, ainsi que pour tester et perfectionner les connaissances plutt que de reprsenter des dfis majeurs. (Je prsume que vous les trouverez par vous-mme ou plutt qu'ils vous trouveront).

0.6.1 - Solutions des exercicesLes solutions des exercices se trouvent dans le document lectronique The Thinking in C++ Annotated Solution Guide, disponible pour un faible cot sur http://www.BruceEckel.com.

0.7 - Le Code Source

- 15 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

Le code source de ce livre est disponible en freeware sous copyright, via le site Web http://www.BruceEckel.com. Le copyright vous empche de rutiliser le code sans autorisation dans un mdium 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, conu 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 prinstall). Dans le rpertoire de dpart o vous avez dcompact 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 autoriss utiliser le code pour vos projets ainsi qu' des fins d'ducation la condition de conserver l'indication de copyright.

0.8 - Normes du langageDans ce livre, pour me rfrer la conformit au standard C ISO, je parlerai gnralement simplement de 'C'. Je ferai une distinction uniquement s'il est ncessaire de diffrencier 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- 16 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

le terme C++ standardpour me rfrer au langage standardis. Si je me rfre simplement C++ vous devez considrer 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-mme. Steve Clamage, prsident du comit, l'a clarifi : Il y a deux comits de normalisation du C++ : le comit J16 NCITS (anciennement X3) et le comit ISO JTC1/SC22/WG14. L'ANSI a charg le NCITS de crer des comits techniques pour dvelopper des normes nationales amricaines Le J16 a t charg en 1989 de crer une norme amricaine pour le C++. Vers 1991, le WG14 a t charg de crer 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 comits se runissent en mme temps au mme endroit, et la voix du J16 constitue le vote amricain au WG14. Le WG14 dlgue 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 amricaine pour le C++. Ainsi, l'"ISO" est la manire exacte de se rfrer au standard C++.

0.8.1 - Support du langageVotre compilateur peut ne pas supporter toutes les fonctionnalits traites dans ce livre, particulirement si vous n'en avez pas la version la plus rcente. Implmenter un langage comme le C++ est une tche Herculenne, et vous pouvez vous attendre ce que les fonctionnalits apparaissent par petits bouts plutt que toutes en mme temps. Mais si vous essayez un des exemples du livre et obtenez beaucoup d'erreurs du compilateur, ce n'est pas ncessairement un bug du code ou du compilateur ; c'est peut-tre simplement que a n'a pas encore t implment sur votre propre compilateur.

0.9 - Le CD ROM du livreLe contenu principal du CD ROM fourni la fin de ce livre est une "confrence sur CD ROM" intitule 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 confrences audio et des prsentations, 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 Cest de vous emmener prudemment travers les principes fondamentaux du langage C. Il se concentre sur les connaissances ncessaires 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 rponses guides. 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 plutt tre utilis comme une prparation 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.

0.10 - CD ROMs, confrences, et consultations- 17 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

Des confrences sur CD ROM sont prvues pour couvrir les volumes 1 et 2 de ce livre. Elles comprennent de nombreuses heures de mes confrences audio qui accompagnent des prsentations qui couvrent un domaine slectionn de chaque chapitre du livre. Elles peuvent tre consultes sur la plupart des ordinateurs si vous avez un lecteur de CD ROM et une carte son. Ces CDs peuvent tre achets sur www.BruceEckel.com, o vous trouverez plus d'informations et d'chantillons de confrences. Ma socit, MindView, Inc., propose des confrences publiques de formation pratique bases sur le contenu de ce livre et galement sur des sujets avancs. Le domaine slectionn de chaque chapitre reprsente une leon, qui est suivie par des exercices assists, de manire ce que chaque tudiant reoit une attention personnalise. 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 confrences et toute autre information de contact peuvent tre trouves 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 activits de consultant, parce que je trouve que le conseil est stimulant, ducatif, et une de mes expriences professionnelles les plus agrables. Ainsi, je ferai de mon mieux pour vous loger dans mon agenda, ou pour vous fournir un de mes associs (qui sont des personnes que je connais bien et en qui j'ai confiance, et souvent des personnes qui co-dveloppent et prsentent les confrences avec moi).

0.11 - ErreursPeu importe le nombre d'astuces utilises par un crivain pour dtecter les erreurs, certaines vont toujours s'introduire dans le texte et sauteront aux yeux d'un lecteur diffrent. Si vous dcouvrez quelque chose qui vous semble tre une erreur, utilisez, s'il-vous-plat, le formulaire de corrections que vous trouverez sur le site www.BruceEckel.com. Votre aide est apprcie.

0.12 - A propos de la couvertureLa premire dition de ce livre avait mon visage sur la couverture, mais j'ai souhait ds le dbut avoir pour la seconde dition une couverture qui serait plus une oeuvre d'art, comme la couverture de Penser en Java. Pour certaines raisons, le C++ me semble suggrer l'Art Dco avec ses courbes simples et ses chromes brosss. 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 premire fois dans la chorale junior du lyce, a continu pour devenir un excellent dessinateur et auteur. Il a fait pratiquement tous mes dessins, y compris la couverture pour la premire dition de ce livre. Pendant le processus de conception de couverture, Daniel, mcontent des progrs que nous faisions, continuait demander "Comment cela relie-t-il les personnes aux ordinateurs ?" nous tions coincs. Sur un caprice, sans ide particulire 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 dcrit, "Autotracer est la manire 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 rsultat qui ressemble une carte topographique de mon visage, une image qui pourrait tre la faon dont un ordinateur pourrait voir les personnes. J'ai pris cette image et l'ai photocopie sur du papier aquarelle (certains copieurs couleur peuvent manipuler des papiers pais), et j'ai alors commenc faire de nombreuses expriences en ajoutant de l'aquarelle l'image. Nous avons choisi nos prfres, et Daniel les a de nouveau scannes et arranges sur la couverture, ajoutant le texte et les autres composants graphiques. Le processus complet s'est droul sur plusieurs mois, principalement cause du temps qu'il m'a fallu pour les aquarelles. Mais je l'ai particulirement apprci 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- 18 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

de la pratique est rellement vrai).

0.13 - Conception et production du livreLe design intrieur du livre a t conu par Daniel Will-Harris, qui avait l'habitude de jouer avec des lettres dcalcomanies au lyce tandis qu'il attendait l'invention des ordinateurs et de la microdition. Cependant, j'ai produit la version imprimable moi-mme, ainsi les erreurs de composition sont miennes. Microsoft Word versions 8 et 9 pour Windows ont t utilis pour crire ce livre et crer la version imprimable, ainsi que pour gnrer la table des matires 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 crer certains des outils pour vrifier le code, et aurait t employ pour l'outil d'extraction de code si je l'avais dcouvert plus tt. J'ai cr les diagrammes avec Visio - merci Visio Corporation pour avoir cr cet outil trs 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 imprime 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 journe de multiples rvisions plutt que de devoir compter sur mon imprimante laser et les services express de nuit. (Nous avons tout d'abord essay le procd d'Acrobat sur Thinking in Java, et j'ai pu uploader la version finale de ce livre l'imprimeur aux Etats-Unis depuis l'Afrique du Sud.) La version HTML a t cre 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 pour avoir conu un outil aussi utile et particulirement fiable.) Les fichiers rsultants ont t nettoys grce un programme que j'ai mis au point en mlangeant plusieurs programme Python, et les WMF ont t convertis en GIF avec JASC PaintShop Pro 6 et son outil de traitement des conversions (merci JASC pour avoir rsolu tant de problmes pour moi avec leur excellent produit). La coloration syntaxique a t ajoute via un script Perl, contribution gnreuse de Zafir Anjum.

0.14 - RemerciementsTout d'abord merci tout ceux sur Internet qui ont soumis leurs corrections et leurs suggestions; vous avez t trs utiles en amliorant la qualit de ce livre, et je n'aurais pas pu le faire sans vous. Remerciements tout particulier John Cook. Les ides et la comprhensibilit 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 particulirement salutaire et gnreux de sa perspicacit), Bill Plauger, Reg Charney, Tom Penello, Tom Plum, Sam Druker, et Uwe Steinmueller; des personnes qui sont intervenues pendant ma prsentation la Confrence sur le Dveloppement Logiciel; et souvent des tudiants qui, pendant mes sminaires, 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 fournie un serveur Web. Mon ami Richard Hale Shaw et moi avons enseign le C++ ensemble; la perspicacit de Richard et son soutient ont t trs 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 spcial tous mes professeurs et tous mes tudiants (qui sont galement mes professeurs).

- 19 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

Et pour les auteurs prfrs, mes profondes apprciation 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. A 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 rdactrice lectronique (???) Stephanie English. Pour le marketing, Bryan Gambrel et Jennie Burger. Sonda Donovan qui m'a aid pour la ralisation du CD Rom. Daniel Will-Harris (bien sr) qui a cr la srigraphie du disque lui-mme. A toutes les grandes gens de Crested Butte, merci pour en avoir fait un lieu magique, spcialement Al Smith (crateur 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 gniales qui tranent Camp4 et rendent mes matines intressantes. La troupe d'amis supporters inclut, mais n'est pas limite 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 sr Maman et Papa.

- 20 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

1 - Introduction sur les ObjetsLa gense de la rvolution informatique fut dans l'invention d'une machine. La gense de nos langage de programmation tend donc ressembler cette machine. Mais les ordinateurs ne sont pas tant des machines que des outils d'amplification de l'esprit( des vlos pour le cerveau , comme aime le rpter Steve Jobs) et un nouveau moyen d'expression. Ainsi, ces outils commencent ressembler moins des machines et plus des parties de notre cerveau ou d'autres moyens d'expressions telles que l'criture, la peinture, la sculpture ou la ralisation de films. La Programmation Oriente Objet fait partie de cette tendance de l'utilisation de l'ordinateur en tant que moyen d'expression. Ce chapitre prsente les concepts de base de la programmation oriente objet (POO), ainsi qu'un survol des mthodes de dveloppement de la POO. Ce chapitre et ce livre prsupposent que vous avez dj expriment un langage de programmation procdural, qui ne soit pas forcment le C. Si vous pensez que vous avez besoin de plus de pratique dans la programmation et/ou la syntaxe du C avant de commencer ce livre, vous devriez explorer le CD ROM fourni avec le livre, Thinking in C: Foundations for C++ and Java, galement disponible sur www.BruceEckel.com. Ce chapitre tient plus de la culture gnrale. Beaucoup de personnes ne veulent pas se lancer dans la programmation oriente objet sans en comprendre d'abord les tenants et les aboutissants. C'est pourquoi beaucoup de concepts seront introduits ici afin de vous donner un solide aperu de la POO. Au contraire, certaines personnes ne saisissent les concepts gnraux qu'aprs en avoir compris une partie des mcanismes; ces gens-l se sentent embourbs et perdus s'ils n'ont pas un bout de code se mettre sous la dent. Si vous faites partie de cette catgorie de personnes et tes impatients d'attaquer les spcificits du langage, vous pouvez sauter ce chapitre - cela ne vous gnera pas pour l'criture de programmes ou l'apprentissage du langage. Mais vous voudrez peut-tre y revenir plus tard pour approfondir vos connaissances sur les objets, les comprendre et assimiler la conception objet.

1.1 - Les bienfaits de l'abstractionTous les langages de programmation fournissent des abstractions. On peut dire que la complexit des problmes que vous tes capable de rsoudre est directement proportionnelle au type et la qualit d'abstraction. Par type , il faut comprendre Que tentez-vous d'abstraire ? . Le langage assembleur est une petite abstraction de la machine sous-jacente. Beaucoup de langages impratifs (tels que Fortran, BASIC, et C) sont des abstractions du langage assembleur. Ces langages sont de nettes amliorations par rapport l'assembleur, mais leur abstraction premire requiert que vous rflchissiez en termes de structure de l'ordinateur plutt qu' la structure du problme que vous essayez de rsoudre. Le programmeur doit tablir l'association entre le modle de la machine (dans l'espace solution , qui est le lieu o vous modlisez le problme, tel que l'ordinateur) et le modle du problme rsoudre (dans l'espace problme , qui est l'endroit o se trouve le problme). Les efforts requis pour raliser cette association, et le fait qu'elle est trangre au langage de programmation, produit des programmes difficiles crire et entretenir, ce qui a men la cration de l'industrie du Gnie Logiciel. L'alternative la modlisation de la machine est de modliser le problme que vous tentez de rsoudre. Les premiers langages tels que LISP ou APL choisirent une vue particulire du monde ( Tous les problmes se ramnent des listes ou Tous les problmes sont algorithmiques ). PROLOG convertit tous les problmes en chanes de dcision. Des langages ont t crs pour la programmation par contrainte, ou pour la programmation ne manipulant que des symboles graphiques (ces derniers se sont rvls tre trop restrictifs). Chacune de ces approches est une bonne solution pour la classe particulire de problmes qu'ils ont a rsoudre, mais devient plus dlicate ds lors que vous les sortez de leur domaine. L'approche oriente objet va un pas plus loin en fournissant des outils au programmeur pour reprsenter des lments dans l'espace problme. Cette reprsentation est assez gnrale pour que le programmeur ne soit

- 21 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

restreint aucun type particulier de problme. Nous nous rfrons aux lments dans l'espace problme et leur reprsentation dans l'espace solution en tant qu' objets . (Bien sr, vous aurez aussi besoin d'autres objets qui n'ont pas leur analogue dans l'espace problme). L'ide est qu'on permet au programme de s'adapter au fond du problme en ajoutant de nouveaux types d'objets , de faon ce que, quand vous lisez le code dcrivant la solution, vous lisez aussi quelque chose qui dcrit le problme. C'est un langage d'abstraction plus flexible et puissant que tout ce que nous avons eu jusqu' prsent. Ainsi, la POO vous permet de dcrire le problme selon les termes du problme plutt que selon les termes de la machine sur laquelle la solution sera excute. Cependant, il y a toujours une connexion l'ordinateur. Chaque objet ressemble un mini-ordinateur ; il a un tat, et il a des oprations que vous pouvez lui demander d'excuter. Cependant, cela ne semble pas tre une si mauvaise analogie avec les objets du monde rel - ils ont tous des caractristiques et des comportements. Des concepteurs de langage ont dcrt que la programmation oriente objet en elle-mme n'tait pas adquate pour rsoudre facilement tous les problmes de programmation, et recommandent la combinaison d'approches varies dans des langages de programmation multiparadigmes. Alan Kay a rsum les cinq caractristiques de base de Smalltalk, le premier vritable langage de programmation orient objet et l'un des langages sur lequel est bas C++. Ces caractristiques reprsentent une approche pure de la programmation oriente objet : 1 Toute chose est un objet. Pensez un objet comme une variable amliore : il stocke des donnes, mais vous pouvez effectuer des requtes sur cet objet, lui demander de faire des oprations sur lui-mme. En thorie, vous pouvez prendre n'importe quel composant conceptuel du problme que vous essayez de rsoudre (un chien, un immeuble, un service administratif, etc...) et le reprsenter en tant qu'objet dans le programme. Un programme est un groupe d'objets s'indiquant quoi faire en envoyant des messages. Pour qu'un objet effectue une requte, vous envoyez un message cet objet. Plus concrtement, vous pouvez penser un message comme un appel de fonction appartenant un objet particulier. Chaque objet a sa propre mmoire compose d'autres objets. Autrement dit, vous crez un nouveau type d'objet en crant un paquetage contenant des objets dj existants. Ainsi, vous pouvez crer un programme dont la complexit est cache derrire la simplicit des objets. Chaque objet a un type. Dans le jargon, chaque objet est une instanced'une classe, o classe est synonyme de type . La caractristique distinctive la plus importante d'une classe est : Quels messages pouvez-vous lui envoyer ? . Tous les objets d'un type particulier peuvent recevoir les mmes messages. C'est une caractristique lourde de signification, comme vous le verrez plus tard. Parce qu'un objet de type cercle est galement un objet de type forme , un cercle garanti d'accepter les messages de forme. Cela signifie que vous pouvez crire du code qui parle aux formes et qui sera automatiquement accept par tout ce qui correspond la description d'une forme. Cette substituabilitest l'un des concepts les plus puissants de la POO.

2 3 4 5

1.2 - Un objet dispose d'une interfaceAristote fut probablement le premier commencer une tude approfondie du concept de type; il parle de la classe des poissons et la classe des oiseaux . L'ide que tous les objets, tout en tant uniques, appartiennent une classe d'objets qui ont des caractristiques et des comportements en commun fut utilise directement dans le premier langage orient objet, Simula-67, avec son mot clef fondamental classqui introduit un nouveau type dans un programme. Simula, comme son nom l'indique, a t conu pour dvelopper des simulations telles que "le problme du guichet de banque" Vous trouverez une implmentation intressante de ce problme dans le Volume 2 de ce livre, disponible sur www.BruceEckel.com.Dans celle-ci, vous avez un ensemble de guichetiers, de clients, de comptes, de transactions et de devises - un tas d'objets . Des objets semblables, leur tat durant l'excution du programme mis part, sont groups ensemble en tant que classes d'objets et c'est de l que vient le mot clef class. Crer des types de donnes abstraits (des classes) est un concept fondamental dans la programmation

- 22 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

oriente objet. On utilise les types de donnes abstraits de manire quasi identique aux types de donnes prdfinis. On peut crer des variables d'un type particulier (appels objetsou instancesdans le jargon orient objet) et manipuler ces variables (ce qu'on appelle envoyer des messagesou des requtes; on envoie un message et l'objet se dbrouille pour le traiter). Les membres (lments) d'une mme classe partagent des caractristiques communes : chaque compte dispose d'un solde, chaque guichetier peut accepter un dpt, etc. Cependant, chaque lment a son propre tat, chaque compte a un solde diffrent, chaque guichetier a un nom. Ainsi, les guichetiers, clients, comptes, transactions, etc. peuvent tous tre reprsents par une unique entit au sein du programme. Cette entit est l'objet, et chaque objet appartient une classe particulire qui dfinit ses caractristiques et ses comportements. Donc, comme la programmation oriente objet consiste en la cration de nouveaux types de donnes, quasiment tous les langages orients objet utilisent le mot clef class . Quand vous voyez le mot type pensez classe et inversement Certains font une distinction, au motif que le type dtermine l'interface tandis que la classe est une implmentation particulire de cette interface. Comme une classe dcrit un ensemble d'objets partageant des caractristiques (donnes) et des comportements (fonctionnalits) communs, une classe est rellement un type de donnes. En effet, un nombre en virgule flottante par exemple, dispose d'un ensemble de caractristiques et de comportements. La diffrence est qu'un programmeur dfinit une classe pour reprsenter un problme au lieu d'tre forc d'utiliser un type de donnes conu pour reprsenter une unit de stockage de l'ordinateur. Le langage de programmation est tendu en ajoutant de nouveaux types de donnes spcifiques nos besoins. Le systme de programmation accepte la nouvelle classe et lui donne toute l'attention et le contrle de type qu'il fournit aux types prdfinis. L'approche oriente objet n'est pas limite aux simulations. Que vous pensiez ou non que tout programme n'est qu'une simulation du systme qu'on reprsente, l'utilisation des techniques de la POO peut facilement rduire un ensemble de problmes une solution simple. Une fois qu'une classe est cre, on peut crer autant d'objets de cette classe qu'on veut et les manipuler comme s'ils taient les lments du problme qu'on tente de rsoudre. En fait, l'une des difficults de la programmation oriente objet est de crer une bijection entre les lments de l'espace problme et les lments de l'espace solution. Mais comment utiliser un objet? Il faut pouvoir lui demander d'excuter une requte, telle que terminer une transaction, dessiner quelque chose l'cran, ou allumer un interrupteur. Et chaque objet ne peut traiter que certaines requtes. Les requtes qu'un objet est capable de traiter sont dfinies par son interface, et son type est ce qui dtermine son interface. Prenons l'exemple d'une ampoule lectrique :

Ampoule amp;

- 23 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

amp.allumer();

L'interface prcise quellesoprations on peut effectuer sur un objet particulier. Cependant, il doit exister du code quelque part pour satisfaire cette requte. Ceci, avec les donnes caches, constitue l' implmentation. Du point de vue de la programmation procdurale, ce n'est pas si compliqu. Un type dispose d'une fonction associe chaque requte possible, et quand on effectue une requte particulire sur un objet, cette fonction est appele. Ce mcanisme est souvent rsum en disant qu'on envoie un message (fait une requte) un objet, et l'objet se dbrouille pour l'interprter (il excute le code associ). Ici, le nom du type / de la classe est Ampoule, le nom de l'objet Ampoulecr est amp, et on peut demander un objet Ampoulede s'allumer, de s'teindre, d'intensifier ou de diminuer sa luminosit. Un objet Ampouleest cr en dclarant un nom ( amp) pour cet objet. Pour envoyer un message cet objet, il suffit de spcifier le nom de l'objet suivi de la requte avec un point entre les deux. Du point de vue de l'utilisateur d'une classe prdfinie, c'est peu prs tout ce qu'il faut savoir pour programmer avec des objets. L'illustration ci-dessus reprend le formalisme Unified Modeling Language(UML). Chaque classe est reprsente par une bote, avec le nom du type dans la partie suprieure, les donnes membres qu'on dcide de dcrire dans la partie du milieu et les fonctions membres(les fonctions appartenant cet objet qui reoivent les messages envoys cet objet) dans la partie du bas de la bote. Souvent on ne montre dans les diagrammes UML que le nom de la classe et les fonctions publiques, et la partie du milieu n'existe donc pas. Si seul le nom de la classe nous intresse, alors la portion du bas n'a pas besoin d'tre montre non plus.

1.3 - L'implmentation cacheIl est utile de diviser le terrain de jeu en crateurs de classe (ceux qui crent les nouveaux types de donnes) et programmeurs clients Je suis redevable de mon ami Scott Meyers pour cette formulation.(ceux qui utilisent ces types de donnes dans leurs applications). Le but des programmeurs clients est de se monter une bote outils pleine de classes rutilisables pour le dveloppement rapide d'applications (RAD, Rapid Application Development en anglais). Les crateurs de classes, eux, se focalisent sur la construction d'une classe qui n'expose que le ncessaire aux programmeurs clients et cache tout le reste. Pourquoi cela ? Parce que si c'est cach, le programmeur client ne peut l'utiliser, et le crateur de la classe peut changer la portion cache comme il l'entend sans se proccuper de l'impact que cela pourrait avoir chez les utilisateurs de sa classe. La portion cache correspond en gnral aux donnes de l'objet qui pourraient facilement tre corrompues par un programmeur client ngligent ou mal inform. Ainsi, cacher l'implmentation rduit considrablement les bugs. Le concept d'implmentation cache ne saurait tre trop lou : dans chaque relation il est important de fixer des frontires respectes par toutes les parties concernes. Quand on cre une bibliothque, on tablit une relation avec un programmeur client, programmeur qui cre une application (ou une bibliothque plus consquente) en utilisant notre bibliothque. Si tous les membres d'une classe sont accessibles pour tout le monde, alors le programmeur client peut faire ce qu'il veut avec cette classe et il n'y a aucun moyen de faire respecter certaines rgles. Mme s'il est vraiment prfrable que l'utilisateur de la classe ne manipule pas directement certains membres de la classe, sans contrle d'accs il n'y a aucun moyen de l'empcher : tout est expos tout le monde. La raison premire du contrle d'accs est donc d'empcher les programmeurs clients de toucher certaines portions auxquelles ils ne devraient pas avoir accs - les parties qui sont ncessaires pour les manipulations internes du type de donnes mais n'appartiennent pas l'interface dont les utilisateurs ont besoin pour rsoudre leur problme. C'est en ralit un service rendu aux utilisateurs car ils peuvent voir facilement ce qui est important pour leurs besoins et ce qu'ils peuvent ignorer. La seconde raison d'tre du contrle d'accs est de permettre au concepteur de la bibliothque de changer le

- 24 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.http://bruce-eckel.developpez.com/livres/cpp/traduction/ticpp2vol1/

Penser en C++ par Bruce Eckel

fonctionnement interne de la classe sans se soucier des effets que cela peut avoir sur les programmeurs clients. Par exemple, on peut implmenter une classe particulire d'une manire simpliste afin d'acclrer le dveloppement, et se rendre compte plus tard qu'on a besoin de la rcrire afin de gagner en performances. Si l'interface et l'implmentation sont clairement spares et protges, cela peut tre ralis facilement et ncessite simplement une rdition des liens par l'utilisateur. Le C++ utilise trois mots clefs pour fixer des limites au sein d'une classe : public, privateet protected. Leur signification et leur utilisation est relativement explicite. Ces spcificateurs d'accsdterminent qui peut utiliser les dfinitions qui suivent. publicveut dire que les dfinitions suivantes sont disponibles pour tout le monde. Le mot clef private, au contraire, veut dire que personne, le crateur de la classe et les fonctions internes de ce type mis part, ne peut accder ces dfinitions. privateest un mur de briques entre le crateur de la classe et le programmeur client. Si quelqu'un tente d'accder un membre dfini comme private, ils rcupreront une erreur lors de la compilation. protectedse comporte tout comme private, en moins restrictif : une classe drive a accs aux membres protected, mais pas aux membres private. L'hritage sera introduit bientt.

1.4 - Rutilisation de l'implmentationUne fois qu'une classe a t cre et teste, elle devrait (idalement) reprsenter une partie de code utile. Il s'avre que cette rutilisabilit n'est pas aussi facile obtenir que cela ; cela demande de l'exprience et de la perspicacit pour produire une bonne conception. Mais une fois bien conue, cette classe ne demande qu' tre rutilise. La rutilisation de code est l'un des plus grands avantages que les langages orients objets fournissent. La manire la plus simple de rutiliser une classe est d'utiliser directement un objet de cette classe, mais on peut aussi placer un objet de cette classe l'intrieur d'une nouvelle classe. On appelle cela crer un objet membre . La nouvelle classe peut tre constitue de n'importe quel nombre d'objets d'autres types, selon la combinaison ncessaire pour que la nouvelle classe puisse raliser ce pour quoi elle a t conue. Parce que la nouvelle classe est compose partir de classes existantes, ce concept est appel composition(ou, plus gnralement, agrgation). On se rfre souvent la composition comme une relation possde-un , comme dans une voiture possde un moteur .

(Le diagramme UML ci-dessus indique la composition avec le losange rempli, qui indique qu'il y a un moteur dans une voiture. J'utiliserai une forme plus simple : juste une ligne, sans le losange, pour indiquer une association. C'est un niveau de dtails gnralement suffisant pour la plupart des diagrammes, et l'on n'a pas besoin de se soucier si l'on utilise l'agrgation ou la composition.) La composition s'accompagne d'une grande flexibilit : les objets membres de la nouvelle classe sont gnralement privs, ce qui les rend inaccessibles aux programmeurs clients de la classe. Cela permet de modifier ces membres sans perturber le code des clients existants. On peut aussi changer les objets membres lors la phase d'excution, pour changer dynamiquement le comportement du programme. L'hritage, dcrit juste aprs, ne dispose pas de cette flexibilit car le compilateur doit placer des restrictions lors de la compilation sur les classes cres avec hritage. Parce que la notion d'hritage est trs importante au sein de la programmation oriente objet, elle est trop souvent accentue, et le programmeur novice pourrait croire que l'hritage doit tre utilis partout. Cela mne des conceptions ultra compliques et cauchemardesques. La composition est la premire approche examiner lorsqu'on cre une nouvelle classe, car elle est plus simple et plus flexible. Le design de la classe en sera plus

- 25 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Bruce Eckel. Au