penser en c++ - bruce eckel (traduction) 2008

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].

Upload: docteur-boris-le-vrai

Post on 01-Dec-2015

130 views

Category:

Documents


18 download

TRANSCRIPT

  • Penser en C++

    Volume 1par 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, dontl'original est disponible ici : [lien].

  • 0 - Prface0.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 - Prrequis0.3 - Apprendre le C++0.4 - Buts0.5 - Chapitres0.6 - Exercices

    0.6.1 - Solutions des exercices0.7 - Le Code Source0.8 - Normes du langage

    0.8.1 - Support du langage0.9 - Le CD ROM du livre0.10 - CD ROMs, confrences, et consultations0.11 - Erreurs0.12 - A propos de la couverture0.13 - Conception et production du livre0.14 - Remerciements

    1 - Introduction sur les Objets1.1 - Les bienfaits de l'abstraction1.2 - Un objet dispose d'une interface1.3 - L'implmentation cache1.4 - Rutilisation de l'implmentation1.5 - Hritage : rutilisation de l'interface

    1.5.1 - Les relations est-un vs. est-comme-un1.6 - Polymorphisme : des objets interchangeables1.7 - Crer et dtruire les objets1.8 - Traitement des exceptions : grer les erreurs1.9 - Analyse et conception

    1.9.1 - Phase 0 : Faire un plan1.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 systme1.9.5 - Phase 4 : Itrer sur les cas d'utilisation1.9.6 - Phase 5 : Evolution1.9.7 - Les plans sont payants

    1.10 - Extreme programming1.10.1 - Commencer par crire les tests1.10.2 - Programmation en binme

    1.11 - Les raisons du succs du C++1.11.1 - Un meilleur C1.11.2 - Vous tes dj sur la courbe d'apprentissage.1.11.3 - Efficacit1.11.4 - Les systmes sont plus faciles exprimer et comprendre1.11.5 - Puissance maximale grce aux bibliothques1.11.6 - Rutilisation des sources avec les templates1.11.7 - Traitement des erreurs1.11.8 - Mise en oeuvre de gros projets

    1.12 - Stratgies de transition1.12.1 - Les grandes lignes1.12.2 - Ecueils de la gestion

    1.13 - Rsum2 - Construire et utiliser les objets

    Penser en C++ par Bruce Eckel

    - 2 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • 2.1 - Le processus de traduction du langage2.1.1 - Les interprteurs2.1.2 - Les compilateurs2.1.3 - Le processus de compilation

    2.2 - Outils de compilation spare2.2.1 - Dclarations vs. dfinitions2.2.2 - Edition des liens2.2.3 - Utilisation des bibliothques

    2.3 - Votre premier programme C++2.3.1 - Utilisation de la classe iostream2.3.2 - Espaces de noms2.3.3 - Principes fondamentaux de structure de programme2.3.4 - "Bonjour tout le monde !"2.3.5 - Lancer le compilateur

    2.4 - Plus sur les flux d'entre-sortie2.4.1 - Concatnation de tableaux de caractres2.4.2 - Lire les entres2.4.3 - Appeler d'autres programmes

    2.5 - Introduction aux chanes de caractres2.6 - Lire et crire des fichiers2.7 - Intoduction la classe vector2.8 - Rsum2.9 - Exercices

    3 - Le C de C++3.1 - Cration de fonctions

    3.1.1 - Valeurs de retour des fonctions3.1.2 - Utilisation de la bibliothque de fonctions du C3.1.3 - Crer vos propres bibliothques avec le bibliothcaire

    3.2 - Contrle de l'excution3.2.1 - Vrai et faux3.2.2 - if-else3.2.3 - while3.2.4 - do-while3.2.5 - for3.2.6 - Les mots cl break et continue3.2.7 - switch3.2.8 - Du bon et du mauvais usage du goto3.2.9 - Rcursion

    3.3 - Introduction aux operateurs3.3.1 - Priorit3.3.2 - Auto incrmentation et dcrmentation

    3.4 - Introduction aux types de donnes3.4.1 - Types intgrs de base3.4.2 - bool, true, & false3.4.3 - Spcificateurs3.4.4 - Introduction aux pointeurs3.4.5 - Modification d'objets extrieurs3.4.6 - Introduction aux rfrences en C++3.4.7 - Pointeurs et rfrences comme modificateurs

    3.5 - Porte des variables3.6 - Dfinir des variables " la vole"3.6 - Dfinir l'allocation mmoire

    3.6.1 - Variables globales3.6.2 - Variables locales3.6.3 - static

    Penser en C++ par Bruce Eckel

    - 3 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • 3.6.4 - extern3.6.5 - Constantes3.6.6 - volatile

    3.7 - Operateurs et leurs usages3.7.1 - L'affectation3.7.2 - Oprateurs mathmatiques3.7.3 - Oprateurs relationnels3.7.4 - Oprateurs logiques3.7.5 - Oprateurs bit bit3.7.6 - Oprateurs de dcalage3.7.7 - Oprateurs unaires3.7.8 - L'oprateur ternaire3.7.9 - L'oprateur virgule3.7.10 - Pige classique quand on utilise les oprateurs3.7.11 - Oprateurs de transtypage3.7.12 - Transtypage C++ explicite3.7.13 - sizeof Un oprateur par lui mme3.7.14 - Le mot clef asm3.7.15 - Oprateurs explicites

    3.8 - Cration de type composite3.8.1 - Alias de noms avec typedef3.8.2 - Combiner des variables avec des struct3.8.3 - Eclaircir les programmes avec des enum3.8.4 - Economiser de la mmoire avec union3.8.5 - Tableaux

    3.9 - Conseils de dboguage3.9.1 - Drapeaux de dboguage3.9.2 - Transformer des variables et des expressions en chanes de caractre3.9.3 - la macro C assert( )

    3.10 - Adresses de fonctions3.10.1 - Dfinir un pointeur de fonction3.10.2 - Dclarations complexes & dfinitions3.10.3 - Utiliser un pointeur de fonction3.10.4 - Tableau de pointeurs de fonction

    3.11 - Make: gestion de la compilation spare3.11.1 - Les actions du Make3.11.2 - Les makefiles de ce livre3.11.3 - Un exemple de makefile

    3.12 - Rsum3.13 - Exercices

    4 - Abstraction des donnes4.1 - Une petite bibliothque dans le style C

    4.1.1 - Allocation dynamique de mmoire4.1.2 - Mauvaises conjectures

    4.2 - Qu'est-ce qui ne va pas?4.3 - L'objet de base4.4 - Qu'est-ce qu'un objet?4.5 - Typage de donnes abstraites4.6 - Dtails sur les objest4.7 - L'tiquette d'un fichier d'en-tte

    4.7.1 - L'importance des fichiers d'en-tte4.7.2 - Le problme des dclarations multiples4.7.3 - Les directives #define, #ifdef et #endif du prprocesseur4.7.4 - Un standard pour les fichiers d'en-tte4.7.5 - Les espaces de nommage dans les fichiers d'en-tte

    Penser en C++ par Bruce Eckel

    - 4 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • 4.7.6 - Utiliser des fichiers d'en-tte dans des projets4.8 - Structures imbriques

    4.8.1 - Rsolution de porte globale4.9 - Rsum4.10 - Exercices

    5 - Cacher l'implmentation5.1 - Fixer des limites5.2 - Le contrle d'accs en C++

    5.2.1 - protected5.3 - L'amiti

    5.3.1 - Amis embots5.3.2 - Est-ce pur ?

    5.4 - Organisation physique d'un objet5.5 - La classe

    5.5.1 - Modifier Stash pour employer le contrle d'accs5.5.2 - Modifier Stack pour employer le contrle d'accs

    5.6 - Manipuler les classes5.6.1 - Dissimuler l'implmentation5.6.2 - Rduire la recompilation

    5.7 - Rsum5.8 - Exercices

    6 - Initialisation & Nettoyage6.1 - Initialisation garantie avec le constructeur6.2 - Garantir le nettoyage avec le destructeur6.3 - Elimination de la dfinition de bloc

    6.3.1 - les boucles6.3.2 - Allocation de mmoire

    6.4 - Stash avec constructueur et destructeur6.5 - Stack avec des constructeurs & des destructeurs6.6 - Initialisation d'aggrgat6.7 - Les constructeurs par dfaut6.8 - Rsum6.9 - Exercices

    7 - Fonctions surcharge et arguments par dfaut7.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 surchargement7.3 - unions7.4 - Les arguments par dfaut

    7.4.1 - Paramtre fictif7.5 - Choix entre surcharge et arguments par dfaut7.6 - Rsum7.7 - Exercices

    8 - Constantes8.1 - Substitution de valeurs8.2 - Les pointeurs

    8.2.1 - Pointeur vers const8.2.2 - Pointeur const8.2.3 - Assignation et vrification de type

    8.3 - Arguments d'une fonction & valeurs retournes8.3.1 - Passer par valeur const8.3.2 - Retour par valeur const8.3.3 - Passer et retourner des adresses

    8.4 - Classes

    Penser en C++ par Bruce Eckel

    - 5 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • 8.4.1 - const dans les classes8.4.2 - Constantes de compilation dans les classes8.4.3 - objets cont & fonctions membres

    8.5 - volatile8.6 - Rsum8.7 - Exercices

    9 - Fonctions inlines9.1 - Ecueils du prprocesseurs

    9.1.1 - Les macros et l'accs9.2 - Fonctions inline

    9.2.1 - Les inline dans les classes9.2.2 - Fonctions d'accs

    9.3 - Stash & Stack avec les inlines9.4 - Les inline & le compilateur

    9.4.1 - Limitations9.4.2 - Dclarations aval9.4.3 - Activits caches dans les constructeurs et les destructeurs

    9.5 - Rduire le fouillis9.6 - Caractristiques supplmentaires du prprocesseur

    9.6.1 - Collage de jeton9.7 - Vrification d'erreurs amliore9.8 - Rsum9.9 - Exercices

    10 - Contrle du nom10.1 - Elments statiques issus du C

    10.1.1 - Variables statiques l'intrieur des fonctions10.1.2 - Contrle de l'dition de liens10.1.3 - Autre spcificateurs de classe de stockage

    10.2 - Les namespaces10.2.1 - Crer un espace de nommage10.2.2 - Utiliser un espace de nommage10.2.3 - L'utilisation des espace de nommage

    10.3 - Membres statiques en C++10.3.1 - Dfinir le stockage pour les donnes membres statiques10.3.2 - Classes imbriques et locales10.3.3 - Fonctions membres statiques

    10.4 - Dpendance de l'initialisation statique10.4.1 - Que faire

    10.5 - Spcification alternative des conventions de liens10.6 - Sommaire10.7 - Exercices

    11 - Rfrences & le constructeur de copie11.1 - Les pointeurs en C++11.2 - Les rfrences en C++

    11.2.1 - Les rfrences dans les fonctions11.2.2 - Indications sur le passage d'arguments

    11.3 - Le constructeur par recopie11.3.1 - Passer & renvoyer par valeur11.3.2 - Construction par recopie11.3.3 - Constructeur par recopie par dfaut11.3.4 - Alternatives la construction par recopie

    11.4 - Pointeurs sur membre11.4.1 - Fonctions

    11.5 - Rsum11.6 - Exercices

    Penser en C++ par Bruce Eckel

    - 6 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • 12 - Surcharges d'oprateurs12.1 - Soyez avertis et rassurs12.2 - Syntaxe12.3 - Oprateurs surchargeables

    12.3.1 - Oprateurs unaires12.3.2 - Oprateurs binaires12.3.3 - Arguments & valeurs de retour12.3.4 - oprateurs inhabituels12.3.5 - Oprateurs que vous ne pouvez pas surcharger

    12.4 - Oprateurs non membres12.4.1 - Conseils lmentaires

    12.5 - Surcharge de l'affectation12.5.1 - Comportement de operator=

    12.6 - Conversion de type automatique12.6.1 - Conversion par constructeur12.6.2 - Conversion par oprateur12.6.3 - Exemple de conversion de type12.6.4 - Les piges de la conversion de type automatique

    12.7 - Rsum12.8 - Exercices

    13 - Cration d'Objets Dynamiques13.1 - Cration d'objets

    13.1.1 - L'approche du C au tas13.1.2 - l'operateur new13.1.3 - l'oprateur delete13.1.4 - Un exemple simple13.1.5 - Le surcot du gestionnaire de mmoire

    13.2 - Exemples prcdents revus13.2.1 - detruire un void* est probablement une erreur13.2.2 - La responsabilit du nettoyage avec les pointeurs13.2.3 - Stash pour des pointeurs

    13.3 - new & delete pour les tableaux13.3.1 - Rendre un pointeur plus semblable un tableau

    13.4 - Manquer d'espace de stockage13.5 - Surcharger new & delete

    13.5.1 - La surcharge globale de new & delete13.5.2 - Surcharger new & delete pour une classe13.5.3 - Surcharger new & delete pour les tableaux13.5.4 - Appels au constructeur13.5.5 - new & delete de placement

    13.6 - Rsum13.7 - Exercices

    14 - Hritage & composition14.1 - Syntaxe de la composition14.2 - Syntaxe de l'hritage14.3 - La liste d'initialisation du construteur

    14.3.1 - Initialisation d'un objet membre14.3.2 - Types prdfinis dans la liste d'initialisation

    14.4 - Combiner composition & hritage14.4.1 - Ordre des appels des constructeurs & et des destructeurs

    14.5 - Masquage de nom14.6 - Fonctions qui ne s'hritent pas automatiquement

    14.6.1 - Hritage et fonctions membres statiques14.7 - Choisir entre composition et hritage

    14.7.1 - Sous-typer

    Penser en C++ par Bruce Eckel

    - 7 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • 14.7.2 - hritage priv14.8 - protected

    14.8.1 - hritage protg14.9 - Surcharge d'oprateur & hritage14.10 - Hritage multiple14.11 - Dveloppement incrmental14.12 - Transtypage ascendant

    14.12.1 - Pourquoi "ascendant" ?14.12.2 - Le transtypage ascendant et le constructeur de copie14.12.3 - Composition vs. hritage (rvis)14.12.4 - Transtypage ascendant de pointeur & de reference14.12.5 - Une crise

    14.13 - Rsum14.14 - Exercices

    15 - Polymorphisme & Fonctions Virtuelles15.1 - Evolution des programmeurs C++15.2 - Transtypage ascendant ( upcasting)15.3 - Le problme

    15.3.1 - Liaison d'appel de fonction15.4 - Fonctions virtuelles

    15.4.1 - Extensibilit15.5 - Comment le C++ implmente la liaison tardive

    15.5.1 - Stocker l'information de type15.5.2 - Reprsenter les fonntions virtuelles15.5.3 - Sous le capot15.5.4 - Installer le vpointeur15.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 pures15.8 - L'hritage et la VTABLE

    15.8.1 - Dcoupage d'objets en tranches15.9 - Surcharge & redfinition

    15.9.1 - Type de retour covariant15.10 - Fonctions virtuelles & constructeurs

    15.10.1 - Ordre des appels au constructeur15.10.2 - Comportement des fonctions virtuelles dans les constructeurs

    15.11 - Destructeurs et destructeurs virtuels15.11.1 - Destructeurs virtuels purs15.11.2 - Les virtuels dans les destructeurs15.11.3 - Crer une hirarchie base sur objet

    15.12 - Surcharge d'oprateur15.13 - Transtypage descendant15.14 - Rsum15.15 - Exercices

    16 - Introduction aux Templates16.1 - Les conteneurs

    16.1.1 - Le besoin de conteneurs16.2 - Survol des templates

    16.2.1 - La solution template16.3 - Syntaxe des templates

    16.3.1 - Dfinitions de fonctions non inline16.3.2 - IntStack comme template16.3.3 - Constantes dans les templates

    16.4 - Stack et Stash comme templates

    Penser en C++ par Bruce Eckel

    - 8 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • 16.4.1 - Pointeur Stash modlis16.5 - Activer et dsactiver la possession16.6 - Stocker des objets par valeur16.7 - Prsentation des itrateurs

    16.7.1 - Stack avec itrateurs16.7.2 - PStash avec les iterateurs

    16.8 - Pourquoi les itrateurs ?16.8.1 - Les templates de fonction

    16.9 - Rsum16.10 - Exercices

    17 - A: Le style de codage18 - B: Directives de programmation19 - C: Lectures recommandes

    19.1 - C19.2 - C++ en gnral

    19.2.1 - Ma propre liste de livres19.3 - Profondeurs et recoins19.4 - Analyse & conception

    20 - Copyright et traduction20.1 - Pour la version anglaise :20.2 - Pour la version franaise :

    20.2.1 - Equipe de traduction :20.2.2 - Relecteurs20.2.3 - Mise en place du projet

    Penser en C++ par Bruce Eckel

    - 9 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • 0 - Prface

    Comme n'importe quel langage humain, le C++ permet d'exprimer des concepts. S'il est russi, ce supportd'expression sera plus simple et plus flexible que les solutions alternatives, qui au fur et mesure que lesproblmes s'amplifient, deviennent plus complexes.

    On ne peut pas simplement considrer le C++ comme un ensemble de fonctionnalits - certaines fonctionnalitsn'ayant pas de sens prises part. On ne peut utiliser la somme des parties que si l'on pense conception, et nonsimplement code. Et pour comprendre le C++ de cette faon, il faut comprendre les problmes lis au C et laprogrammation en gnral. Ce livre traite des problmes de programmation, pourquoi ce sont des problmes, etl'approche que le C++ a prise pour rsoudre de tels problmes. Ainsi, le groupe de fonctionnalits que je traitedans chaque chapitre sera organis selon la faon que j'ai de voir comment le langage rsout un type particulier deproblme. De cette manire j'espre vous amener, au fur et mesure, depuis la comprhension du C jusqu'aupoint 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 vouspermettra de comprendre le langage jusque dans ses moindres dtails - si vous avez affaire un puzzle, vousserez capable de l'assembler selon votre modle et d'en dduire la rponse. J'essayerai de vous transmettre lesides 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 lelangage C++ par la finalisation du standard C++, et pour reflter galement ce que j'ai appris depuis l'criture de lapremire dition. L'ensemble du texte prsent dans la premire dition a t examin et rcrit, parfois ensupprimant de vieux exemples, souvent en modifiant les exemples existants et en en ajoutant de nouveaux, et enajoutant beaucoup de nouveaux exercices. Un rarrangement et un nouveau classement significatif du documentont eu lieu afin de rpercuter la disponibilit de meilleurs outils et ma meilleure apprhension de la faon dont lesgens apprennent le C++. Un nouveau chapitre a t ajout, rapide introduction aux concepts du C et auxfonctionnalits de base du C++, pour ceux qui n'ont pas l'exprience du C pour aborder le reste du livre. Le CDROM reli au dos du livre contient une confrence qui est une introduction encore plus douce aux concepts du Cncessaires 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 ncessairespour passer au C++ ou Java, en laissant de ct les parties difficiles auxquelles les programmeurs C sontconfronts dans leur travail de tous les jours, mais que les langages C++ et Java vous vitent d'utiliser (voireliminent, 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 pasnouveau 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 trelgus au volume 2 de ce livre, y compris des problmes tels l'hritage multiple, la gestion des exceptions, lesmodles de conception, et les sujets sur les systmes stables de compilation et de dbogage.

    0.1.2 - Comment rcuprer le Volume 2 ?

    Penser en C++ par Bruce Eckel

    - 10 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • Tout comme le livre que vous tenez actuellement, Penser en C++, Volume 2est en tlchargement dans sa totalitsur 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 surd'autres confrences-sur-CD ROM proposes par MindView, Inc., des confrences publiques, et des formations,consultations, tutelles, et visites internes.

    0.2 - Prrequis

    Dans la premire dition de ce livre, je suis parti du principe que quelqu'un d'autre vous avait enseign le C et quevous aviez au moins la capacit de le lire confortablement. Mon objectif premier tait de simplifier ce que jetrouvais 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 certaineexprience en programmation. En outre, de mme que vous apprenez beaucoup de nouveaux mots intuitivementen les voyant dans le contexte d'un roman, il est possible d'apprendre beaucoup sur C partir du contexte danslequel 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 pragmatiqueenvers la programmation, trs "dtails pratiques". Pire, mon pass et mon exprience taient tourns vers laprogrammation embarque niveau matriel, dans laquelle le C tait souvent considr comme un langage dehaut-niveau et d'une surpuissance inefficace pour dplacer des bits. J'ai dcouvert plus tard que je n'tais pasvraiment un trs bon programmeur C, cachant mon ignorance des structures, malloc( )et free( ), setjmp( )etlongjmp( ), et autres concepts "sophistiqus", m'loignant rapidement avec honte quand les conversationsabordaient 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 BjarneStroustrup, et j'tais donc livr moi-mme pour simplifier les concepts de base. Ceci a eu comme consquencemon premier livre sur le C++, Using C++, Osborne/McGraw-Hill 1989.ce qui tait essentiellement une extractioncrbrale de mon exprience. Il a t conu comme un guide pour le lecteur afin d'introduire les programmeurs enmme temps au C et au C++. Les deux ditions Using C++ et C++ Inside & Out, Osborne/McGraw-Hill 1993.dulivre ont entran une raction enthousiaste.

    Pratiquement en mme temps que la sortie de Using C++, j'ai commenc enseigner le langage dans desconfrences et des prsentations. Enseigner le C++ (et plus tard le Java) est devenu ma profession ; j'ai vu desttes penches, des visages livides, et des expressions embarrasses dans les assistances partout dans le mondedepuis 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 taientperdues devant de nombreux problmes. J'ai dcouvert, en crant et prsidant pendant de nombreuses annesles sujets C++ et Java la confrence sur le dveloppement logiciel, que les intervenants (moi compris) avaienttendance prsenter au public type trop de sujets trop rapidement. Ainsi en dfinitive, du fait de la diversit desniveaux 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 (etpour beaucoup, je crois, une telle rsistance est gnre par l'ennui), j'ai voulu essayer de garder tout le mondedans 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 conceptionde programmes C++). Par la suite, j'ai dvelopp un cours en utilisant tout ce que j'avais appris de mon exprienced'enseignement. Il aborde le problme de l'apprentissage par des tapes distinctes, faciles digrer, et pour

    Penser en C++ par Bruce Eckel

    - 11 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • impliquer l'auditoire (situation d'apprentissage idale), des exercices suivent chacune des prsentations. Vouspouvez dcouvrir mes confrences publiques sur www.BruceEckel.com, et vous pouvez galement vous yrenseigner 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 ttest en situation dans beaucoup de formes dans de nombreuses confrences. Le retour que j'ai peru de chaqueconfrence m'a aid modifier et recentrer le sujet jusqu' ce que je sente qu'il fonctionne bien comme outildidactique. Mais ce n'est pas simplement une documentation de confrence ; j'ai essay d'entasser autantd'informations que possible dans ces pages, et de la structurer pour vous emmener vers le sujet suivant. Plus quetout autre chose, le livre est conu pour servir le lecteur solitaire qui lutte avec un nouveau langage deprogrammation.

    0.4 - Buts

    Dans ce livre je me suis donn comme buts :

    1 Prsenter le cours pas pas afin que le lecteur assimile chaque concept avant d'aller plus loin.2 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 decomprendre chaque dtail d'un exemple qu'ils ne sont impressionns par la porte du problme qu'il rsout. Ily a galement une limite la taille du code qui peut tre assimil dans une situation de cours magistral, limitequ'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.

    3 Enchaner soigneusement la prsentation des fonctionnalits afin que l'on ne rencontre jamais quoi que cesoit qui n'ait jamais t expos. Bien entendu, ce n'est pas toujours possible, et, dans de telles situations, jedonnerai une brve description en introduction.

    4 Montrer ce que je pense tre important concernant la comprhension du langage, plutt qu'exposer tout monsavoir. Je crois que l'information est fortement hirarchise, qu'il est avr que 95 % des programmeurs n'ontpas besoin de tout connatre, et que cela ne ferait que les embrouiller et accrotre leur impression decomplexit du langage. Pour prendre un exemple en C, en connaissant par coeur le tableau de priorit desoprateurs (ce qui n'est pas mon cas), il est possible d'crire un code astucieux. Mais si vous y rflchissezun instant, ceci risque de drouter le lecteur et/ou le mainteneur de ce code. Il est donc prfrable d'oublier lapriorit des oprateurs, et d'utiliser des parenthses lorsque les choses ne sont pas claires. Une attitudesimilaire sera adopte avec certaines informations du langage C++, qui je pense sont plus importantes pourles ralisateurs de compilateurs que pour les programmeurs.

    5 Maintenir chaque section assez concentre de telle manire que le temps de lecture - et le temps entre lesexercices - soit raisonnable. Non seulement cela maintient l'attention et l'implication des auditeurs lors d'unsminaire, mais cela donne au lecteur une plus grande impression de travail bien fait.

    6 Munir les lecteurs de bases solides afin que leurs connaissances soient suffisantes pour suivre un cours oulire un livre plus difficiles (en particulier, le volume 2 de ce livre).

    7 J'ai essay de n'utiliser aucune version particulire d'un quelconque revendeur C++ parce que, pourapprendre un langage, je ne pense pas que les dtails d'une implmentation particulire soient aussiimportants que le langage lui-mme. La documentation fournie par les revendeurs au sujet de leurs propresspcificits d'implmentation est la plus part du temps suffisante.

    0.5 - Chapitres

    Le C++ est un langage dans lequel des fonctionnalits nouvelles et diffrentes ont t mises en place partir d'unesyntaxe 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 maniredont les dveloppeurs franchissaient les tapes des fonctionnalits du langage C++. Puisque cela semblait tre laprogression naturelle d'un esprit entran aux langages procduraux, j'ai dcid de comprendre et de suivre

    Penser en C++ par Bruce Eckel

    - 12 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • moi-mme ce cheminement et d'acclrer le processus en exprimant et en rpondant aux questions qui me sontvenues 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 ractionsde mes auditoires m'ont aid comprendre quelles parties taient difficiles et ncessitaient des claircissementsparticuliers. Dans les domaines dans lesquels j'ai t ambitieux et o j'ai inclus trop de fonctionnalits la fois, j'ait amen comprendre - travers la prsentation de ces connaissances - que si vous incluez beaucoup denouvelles fonctionnalits, vous devez toutes les expliquer, et cela gnre facilement la confusion des tudiants. Enconsquence, j'ai essay d'introduire le moins de fonctionnalits possibles la fois ; idalement, un conceptprincipal 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 chaquepartie en fonction de vos connaissances actuelles avant de passer la suivante. Pour cela, j'ai conserv desfonctionnalits du C plus longtemps que je ne l'aurais souhait. L'avantage, c'est que vous ne serez pas perturbspar la dcouverte de fonctionnalits C++ utilises avant d'tre expliques, et votre introduction ce langage seradouce 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 maintenirsimplement, la "crise du logiciel" est ne, avec des programmeurs disant "Nous ne pouvons pas terminer lesprojets, et si nous le pouvons, ils sont trop chers !". Cela a entran un certain nombre de rponses, qui sontdveloppes dans ce chapitre avec les ides de la programmation oriente objet (POO) et comment elle tente dersoudre la crise du logiciel. Ce chapitre vous entrane travers les concepts et fonctionnalits de base de la POOet introduit galement les processus d'analyse et de conception. Par ailleurs, vous dcouvrirez les avantages etinconvnients 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 utilisantdes compilateurs et des bibliothques. Il introduit le premier programme C++ du livre et montre comment lesprogrammes sont construits et compils. Des bibliothques objet de base disponibles dans le Standard C++ sontalors introduites. Lorsque vous aurez termin ce chapitre, vous aurez une bonne comprhension de ce que signifiecrire 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 utilisesen C++, ainsi que d'un certain nombre de fonctionnalits de base disponibles uniquement en C++. Il prsentegalement "make", un utilitaire commun dans le monde du dveloppement logiciel, qui est utilis pour compilertous les exemples de ce livre (le code source du livre, qui est disponible sur www.BruceEckel.com, contient unmakefile pour chaque chapitre). Le chapitre 3 suppose que vous ayez de solides connaissances dans deslangages de programmation procduraux comme le Pascal, le C, ou mme du Basic (tant que vous avez critbeaucoup de code dans ce langage, particulirement des fonctions). Si vous trouvez ce chapitre un peu tropdense, vous devriez commencer par la confrence Penser en Cdisponible sur le CD livr avec ce livre (etgalement disponible sur www.BruceEckel.com).

    Chapitre 4 : Abstraction des donnes. La plupart des fonctionnalits en C++ tournent autour de la possibilit decrer de nouveaux types de donnes. Non seulement cela permet une meilleure organisation du code, mais aussicela prpare les fondations pour des capacits plus puissantes de POO. Vous verrez comme cette ide estfacilite par le simple fait de mettre des fonctions l'intrieur de structures, les dtails sur la faon de le faire, et letype de code que cela entrane. Vous apprendrez aussi la meilleure manire d'organiser votre code en fichiersd'en-tte et fichiers d'implmentation.

    Chapitre 5 : Masquer l'implmentation. Vous pouvez dcider que certaines donnes ou fonctions de votrestructure sont inaccessible l'utilisateur de ce nouveau type en les rendant prives. Cela signifie que vous pouvez

    Penser en C++ par Bruce Eckel

    - 13 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • sparer l'implmentation sous-jacente de l'interface que le programmeur client peut voir, et ainsi permettre demodifier facilement cette implmentation sans pour autant affecter le code du client. Le mot-cl classestgalement prsent comme un moyen spcialis de description d'un nouveau type de donnes, et la significationdu 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 desvariables. 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 certaineforme 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 desprojets volumineux, complexes. Tout en le faisant, vous pouvez introduire des bibliothques multiples qui utilisentles mmes noms de fonctions, et vous pouvez aussi choisir d'utiliser le mme nom avec diffrentes significationsdans une bibliothque unique. C++ le facilite avec la surcharge de fonction, qui vous permet de rutiliser le mmenom de fonction tant que les listes d'arguments sont diffrentes. Les arguments par dfaut vous permettentd'appeler la mme fonction de diffrentes faons en fournissant automatiquement des valeurs par dfauts pourcertains de vos arguments.

    Chapitre 8 : Constantes. Ce chapitre couvre les mots-cls constet volatile, qui ont des significationssupplmentaires en C++, particulirement l'intrieur d'une classe. Vous apprendrez ce que signifie appliquerconst la dfinition d'un pointeur. Ce chapitre vous expliquera aussi comment la signification de constvarie quandil est utilis l'intrieur ou l'extrieur des classes, et comment crer des constantes dans les classes lacompilation.

    Chapitre 9 : Fonctions 'inline'. Les macros du prprocesseur liminent les cots d'appel de fonction, mais leprprocesseur limine aussi la vrification du type C++ valable. La fonction 'inline' apporte tous les avantagesd'une macro du prprocesseur plus tous ceux d'un vritable appel de fonction. Ce chapitre explore compltementl'implmentation et l'utilisation des fonctions inline.

    Chapitre 10 : Contrle des noms. Crer des noms est une activit fondamentale en programmation, et quand unprojet devient important, le nombre de noms peut devenir envahissant. Le C++ permet un grand contrle des nomspour leur cration, leur visibilit, leur placement de stockage, et leurs liens. Ce chapitre vous montre comment lesnoms sont contrls en C++ en utilisant deux techniques. Tout d'abord, le mot-cl staticest utilis pour contrler lavisibilit et les liens, et nous tudions sa signification particulire avec les classes. Une technique bien plus utilepour contrler les noms de porte globale est la fonctionnalit d' espace de nommagedu C++, qui vous permet desparer l'espace de nom global en rgions distinctes.

    Chapitre 11 : Rfrences et constructeur par copie. Les pointeurs C++ fonctionnent comme les pointeurs Cavec l'avantage supplmentaire d'une vrification du type plus forte en C++. Le C++ fournit galement une autrepossibilit de manipulation des adresses : de l'Algol et du Pascal, le C++ relve la rfrence, qui laisse lecompilateur grer la manipulation des adresses alors que vous utilisez la notation normale. Vous rencontrerezaussi le constructeur par copie, qui contrle la manire dont les objets sont passs par valeur en argument ou enretour 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 vouspermet d'adoucir la syntaxe d'utilisation de votre type en autorisant des oprateurs comme des appels defonctions. Dans ce chapitre vous apprendrez que la surcharge des oprateurs est simplement un type diffrentd'appel de fonction et vous apprendrez crire le votre, en prenant en considration les utilisations parfoisdroutantes 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-ilcontrler ? Combien de formes un systme de DAO ncessitera-t-il ? Dans le problme gnral de laprogrammation, vous ne pouvez pas connatre la quantit, la dure de vie, ou mme le type des objets requis par

    Penser en C++ par Bruce Eckel

    - 14 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • 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 aussicomment newet deletepeuvent tre surchargs de multiples faons, vous permettant de contrler l'allocation et lalibration de la mmoire.

    Chapitre 14 : Hritage et composition. L'abstraction des donnes vous permet de crer de nouveaux types detoutes pices, mais avec la composition et l'hritage, vous pouvez crer de nouveaux types partir de typesexistants. Avec la composition, vous assemblez un nouveau type en utilisant d'autres types comme des pices, etavec l'hritage, vous crez une version plus spcifique d'un type existant. Dans ce chapitre, vous apprendrez lasyntaxe, la redfinition des fonctions, et l'importance de la construction et de la destruction dans l'hritage et lacomposition.

    Chapitre 15 : Polymorphisme et fonctions virtuelles. Tout seul, vous pourriez prendre neuf mois pour dcouvriret comprendre cette pierre angulaire de la POO. A travers des exemples courts et simples, vous verrez commentcrer une famille de types avec l'hritage, et manipuler les objets de cette famille travers leur classe de basecommune. Le mot-cl virtualvous permet de traiter de faon gnrique tous les objets de cette famille, ce quisignifie que la majeure partie de votre code ne reposera pas sur des informations spcifiques des types. Cela rendvotre programme extensible, et la construction des programmes et la maintenance du code sont plus simples etmoins coteuses.

    Chapitre 16 : Introduction aux modles. L'hritage et la composition vous permettent de rutiliser le code desobjets, mais cela ne rsout pas tous vos besoins de rutilisation. Les modles permettent de rutiliser le codesourceen fournissant au compilateur un moyen de substituer des noms de types dans le corps d'une classe oud'une fonction. Cela aide l'utilisation de bibliothques de classes conteneurs, qui sont des outils importants pourle dveloppement rapide et robuste de programmes orients objet (la bibliothque standard C++ inclus unebibliothque significative de classes conteneurs). Ce chapitre vous donne des bases compltes sur ce sujetessentiel.

    Des sujets supplmentaires (et plus avancs) sont disponibles dans le tome 2 de ce livre, qui peut tre tlchargsur le site www.BruceEckel.com.

    0.6 - Exercices

    Je me suis aperu que des exercices sont trs utiles lors d'un sminaire pour consolider les connaissances destudiants, on en trouvera donc un ensemble la fin de chaque chapitre. Le nombre d'exercices a tconsidrablement 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 raisonnabledans le contexte d'une salle de classe, pendant que l'instructeur vrifie que tous les tudiants ont assimil le sujetde la leon. Quelques exercices sont plus pointus, afin d'viter l'ennui chez les tudiants expriments. La majeurepartie des exercices sont conus pour tre raliss rapidement, ainsi que pour tester et perfectionner lesconnaissances 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 exercices

    Les solutions des exercices se trouvent dans le document lectronique The Thinking in C++ Annotated SolutionGuide, disponible pour un faible cot sur http://www.BruceEckel.com.

    0.7 - Le Code Source

    Penser en C++ par Bruce Eckel

    - 15 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • 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 ledroit 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 disposantd'un utilitaire zip (la plupart le sont - vous pouvez effectuer une recherche sur l'Internet afin de trouver une versionpour votre plateforme si vous n'avez rien de prinstall). Dans le rpertoire de dpart o vous avez dcompact lecode vous trouverez la mention de copyright suivante :

    //:! :Copyright.txtCopyright (c) 2000, Bruce EckelSource code file from the book "Thinking in C++"All rights reserved EXCEPT as allowed by thefollowing statements: You can freely use this filefor your own work (personal or commercial),including modifications and distribution inexecutable form only. Permission is granted to usethis file in classroom situations, including itsuse in presentation materials, as long as the book"Thinking in C++" is cited as the source.Except in classroom situations, you cannot copyand distribute this code; instead, the soledistribution point is http://www.BruceEckel.com(and official mirror sites) where it isavailable for free. You cannot remove thiscopyright and notice. You cannot distributemodified versions of the source code in thispackage. You cannot use this file in printedmedia without the express permission of theauthor. Bruce Eckel makes no representation aboutthe suitability of this software for any purpose.It is provided "as is" without express or impliedwarranty of any kind, including any impliedwarranty of merchantability, fitness for aparticular purpose, or non-infringement. The entirerisk as to the quality and performance of thesoftware is with you. Bruce Eckel and thepublisher shall not be liable for any damagessuffered by you or any third party as a result ofusing or distributing this software. In no eventwill Bruce Eckel or the publisher be liable forany lost revenue, profit, or data, or for direct,indirect, special, consequential, incidental, orpunitive damages, however caused and regardless ofthe theory of liability, arising out of the use ofor inability to use software, even if Bruce Eckeland the publisher have been advised of thepossibility of such damages. Should the softwareprove defective, you assume the cost of allnecessary servicing, repair, or correction. If youthink you've found an error, please submit thecorrection using the form you will find atwww.BruceEckel.com. (Please use the sameform 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 conserverl'indication de copyright.

    0.8 - Normes du langage

    Dans ce livre, pour me rfrer la conformit au standard C ISO, je parlerai gnralement simplement de 'C'. Jeferai 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

    Penser en C++ par Bruce Eckel

    - 16 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • le terme C++ standardpour me rfrer au langage standardis. Si je me rfre simplement C++ vous devezconsidrer 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 normeelle-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 ISOJTC1/SC22/WG14. L'ANSI a charg le NCITS de crer des comits techniques pour dvelopper des normesnationales amricaines

    Le J16 a t charg en 1989 de crer une norme amricaine pour le C++. Vers 1991, le WG14 a t charg decrer 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 auWG14. 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 recommandaitle 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 langage

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

    0.9 - Le CD ROM du livre

    Le 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 surwww.BruceEckel.com). Il contient de nombreuses heures de confrences audio et des prsentations, et peut treconsult 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. Ilse concentre sur les connaissances ncessaires pour vous permettre de passer aux langages C++ ou Java, aulieu d'essayer de faire de vous un expert de tous les points sombres du C. (Une des raisons d'utiliser un langagede haut niveau comme le C++ ou le Java est justement d'viter plusieurs de ces points sombres.) Il contient aussides exercices et des rponses guides. Gardez l'esprit que parce que le chapitre 3 de ce livre surpasse le CDPenser en C, le CD ne se substitue pas ce chapitre, mais devrait plutt tre utilis comme une prparation celivre.

    Merci de noter que le CD ROM est bas sur les navigateurs, vous devez donc avoir un navigateur internet installavant de l'utiliser.

    0.10 - CD ROMs, confrences, et consultations

    Penser en C++ par Bruce Eckel

    - 17 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • Des confrences sur CD ROM sont prvues pour couvrir les volumes 1 et 2 de ce livre. Elles comprennent denombreuses heures de mes confrences audio qui accompagnent des prsentations qui couvrent un domaineslectionn de chaque chapitre du livre. Elles peuvent tre consultes sur la plupart des ordinateurs si vous avezun lecteur de CD ROM et une carte son. Ces CDs peuvent tre achets sur www.BruceEckel.com, o voustrouverez plus d'informations et d'chantillons de confrences.

    Ma socit, MindView, Inc., propose des confrences publiques de formation pratique bases sur le contenu de celivre et galement sur des sujets avancs. Le domaine slectionn de chaque chapitre reprsente une leon, quiest 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 decode. Les informations et les formulaires d'inscription aux prochaines confrences et toute autre information decontact 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 deconsultant, parce que je trouve que le conseil est stimulant, ducatif, et une de mes expriences professionnellesles plus agrables. Ainsi, je ferai de mon mieux pour vous loger dans mon agenda, ou pour vous fournir un de mesassocis (qui sont des personnes que je connais bien et en qui j'ai confiance, et souvent des personnes quico-dveloppent et prsentent les confrences avec moi).

    0.11 - Erreurs

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

    0.12 - A propos de la couverture

    La premire dition de ce livre avait mon visage sur la couverture, mais j'ai souhait ds le dbut avoir pour laseconde dition une couverture qui serait plus une oeuvre d'art, comme la couverture de Penser en Java. Pourcertaines 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 juniordu lyce, a continu pour devenir un excellent dessinateur et auteur. Il a fait pratiquement tous mes dessins, ycompris 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 personnesaux 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 ressemblentvraiment." Il a alors jou avec a jusqu' ce qu'il obtienne un rsultat qui ressemble une carte topographique demon 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 despapiers 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 letexte 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 puparticiper l'art sur la couverture, et parce que a m'a encourag faire plus d'aquarelles (ce qu'ils disent propos

    Penser en C++ par Bruce Eckel

    - 18 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • de la pratique est rellement vrai).

    0.13 - Conception et production du livre

    Le design intrieur du livre a t conu par Daniel Will-Harris, qui avait l'habitude de jouer avec des lettresdcalcomanies au lyce tandis qu'il attendait l'invention des ordinateurs et de la microdition. Cependant, j'aiproduit la version imprimable moi-mme, ainsi les erreurs de composition sont miennes. Microsoft Word versions 8et 9 pour Windows ont t utilis pour crire ce livre et crer la version imprimable, ainsi que pour gnrer la tabledes matires et l'index. (J'ai cr un serveur d'automation COM en Python, appel depuis les macros VBA deWord, pour m'aider dans l'indexation.) Python (voir www.Python.org) a t employ pour crer certains des outilspour 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 avecAdobe Acrobat 4 et imprime directement partir de ce fichier - merci beaucoup Adobe pour avoir cr un outilqui autorise l'envoi par mail des documents d'impression, cela permettant de faire en une journe de multiplesrvisions plutt que de devoir compter sur mon imprimante laser et les services express de nuit. (Nous avons toutd'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 (voirhttp://www.sunpack.com/RTF/) pour faire la majeure partie du travail de conversion HTML. (merci Chris Hectorpour avoir conu un outil aussi utile et particulirement fiable.) Les fichiers rsultants ont t nettoys grce unprogramme que j'ai mis au point en mlangeant plusieurs programme Python, et les WMF ont t convertis en GIFavec JASC PaintShop Pro 6 et son outil de traitement des conversions (merci JASC pour avoir rsolu tant deproblmes pour moi avec leur excellent produit). La coloration syntaxique a t ajoute via un script Perl,contribution gnreuse de Zafir Anjum.

    0.14 - Remerciements

    Tout d'abord merci tout ceux sur Internet qui ont soumis leurs corrections et leurs suggestions; vous avez t trsutiles 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 ChuckAllison, Andrea Provaglio, Dan Saks, Scott Meyers, Charles Petzold, et Michael Wilk; des pionniers du langagecomme 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, RegCharney, Tom Penello, Tom Plum, Sam Druker, et Uwe Steinmueller; des personnes qui sont intervenues pendantma prsentation la Confrence sur le Dveloppement Logiciel; et souvent des tudiants qui, pendant messminaires, 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 soutientont t trs utiles (ainsi que celle de Kim). Merci galement KoAnn Vikoren, Eric Faurot, Jennifer Jessup, TaraArrowood, Marco Pardi, Nicole Freeman, Barbara Hanscome, Regina Ridley, Alex Dunne, et le reste des membresde l'quipe de MFI.

    Un remerciement spcial tous mes professeurs et tous mes tudiants (qui sont galement mes professeurs).

    Penser en C++ par Bruce Eckel

    - 19 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • Et pour les auteurs prfrs, mes profondes apprciation et sympathie pour vos efforts : John Irving, NealStephenson, 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 votrecontribution.

    Merci tout le personnel de Prentice Hall : Alan Apt, Ana Terry, Scott Disanno, Toni Holm, et ma rdactricelectronique (???) 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 srigraphiedu 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 auMidnight 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, Marcoet 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, LaurieAdams, les Cranston, Larry Fogg, Mike and Karen Sequeira, Gary Entsminger et Allison Brody, Kevin, Sonda, etElla Donovan, Chester et Shannon Andersen, Joe Lordi, Dave et Brenda Bartlett, les Rentschler, Lynn et Todd, etleurs familles. Et bien sr Maman et Papa.

    Penser en C++ par Bruce Eckel

    - 20 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • 1 - Introduction sur les Objets

    La gense de la rvolution informatique fut dans l'invention d'une machine. La gense de nos langage deprogrammation 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 lecerveau , 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 tellesque l'criture, la peinture, la sculpture ou la ralisation de films. La Programmation Oriente Objet fait partie decette 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 desmthodes de dveloppement de la POO. Ce chapitre et ce livre prsupposent que vous avez dj expriment unlangage de programmation procdural, qui ne soit pas forcment le C. Si vous pensez que vous avez besoin deplus de pratique dans la programmation et/ou la syntaxe du C avant de commencer ce livre, vous devriez explorerle CD ROM fourni avec le livre, Thinking in C: Foundations for C++ and Java, galement disponible surwww.BruceEckel.com.

    Ce chapitre tient plus de la culture gnrale. Beaucoup de personnes ne veulent pas se lancer dans laprogrammation oriente objet sans en comprendre d'abord les tenants et les aboutissants. C'est pourquoibeaucoup de concepts seront introduits ici afin de vous donner un solide aperu de la POO. Au contraire, certainespersonnes ne saisissent les concepts gnraux qu'aprs en avoir compris une partie des mcanismes; ces gens-lse sentent embourbs et perdus s'ils n'ont pas un bout de code se mettre sous la dent. Si vous faites partie decette catgorie de personnes et tes impatients d'attaquer les spcificits du langage, vous pouvez sauter cechapitre - cela ne vous gnera pas pour l'criture de programmes ou l'apprentissage du langage. Mais vousvoudrez peut-tre y revenir plus tard pour approfondir vos connaissances sur les objets, les comprendre etassimiler la conception objet.

    1.1 - Les bienfaits de l'abstraction

    Tous les langages de programmation fournissent des abstractions. On peut dire que la complexit des problmesque 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 lamachine sous-jacente. Beaucoup de langages impratifs (tels que Fortran, BASIC, et C) sont des abstractionsdu langage assembleur. Ces langages sont de nettes amliorations par rapport l'assembleur, mais leurabstraction premire requiert que vous rflchissiez en termes de structure de l'ordinateur plutt qu' la structuredu problme que vous essayez de rsoudre. Le programmeur doit tablir l'association entre le modle de lamachine (dans l'espace solution , qui est le lieu o vous modlisez le problme, tel que l'ordinateur) et lemodle du problme rsoudre (dans l'espace problme , qui est l'endroit o se trouve le problme). Lesefforts requis pour raliser cette association, et le fait qu'elle est trangre au langage de programmation, produitdes 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. Lespremiers langages tels que LISP ou APL choisirent une vue particulire du monde ( Tous les problmes seramnent des listes ou Tous les problmes sont algorithmiques ). PROLOG convertit tous les problmes enchanes de dcision. Des langages ont t crs pour la programmation par contrainte, ou pour la programmationne manipulant que des symboles graphiques (ces derniers se sont rvls tre trop restrictifs). Chacune de cesapproches est une bonne solution pour la classe particulire de problmes qu'ils ont a rsoudre, mais devient plusdlicate 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 deslments dans l'espace problme. Cette reprsentation est assez gnrale pour que le programmeur ne soit

    Penser en C++ par Bruce Eckel

    - 21 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • restreint aucun type particulier de problme. Nous nous rfrons aux lments dans l'espace problme et leurreprsentation dans l'espace solution en tant qu' objets . (Bien sr, vous aurez aussi besoin d'autres objets quin'ont pas leur analogue dans l'espace problme). L'ide est qu'on permet au programme de s'adapter au fond duproblme en ajoutant de nouveaux types d'objets , de faon ce que, quand vous lisez le code dcrivant lasolution, vous lisez aussi quelque chose qui dcrit le problme. C'est un langage d'abstraction plus flexible etpuissant que tout ce que nous avons eu jusqu' prsent. Ainsi, la POO vous permet de dcrire le problme selonles 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 simauvaise 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 adquatepour rsoudre facilement tous les problmes de programmation, et recommandent la combinaison d'approchesvaries dans des langages de programmation multiparadigmes.

    Alan Kay a rsum les cinq caractristiques de base de Smalltalk, le premier vritable langage de programmationorient objet et l'un des langages sur lequel est bas C++. Ces caractristiques reprsentent une approche purede la programmation oriente objet :

    1 Toute chose est un objet. Pensez un objet comme une variable amliore : il stocke des donnes, maisvous pouvez effectuer des requtes sur cet objet, lui demander de faire des oprations sur lui-mme. Enthorie, vous pouvez prendre n'importe quel composant conceptuel du problme que vous essayez dersoudre (un chien, un immeuble, un service administratif, etc...) et le reprsenter en tant qu'objet dans leprogramme.

    2 Un programme est un groupe d'objets s'indiquant quoi faire en envoyant des messages. Pour qu'unobjet effectue une requte, vous envoyez un message cet objet. Plus concrtement, vous pouvezpenser un message comme un appel de fonction appartenant un objet particulier.

    3 Chaque objet a sa propre mmoire compose d'autres objets. Autrement dit, vous crez un nouveau typed'objet en crant un paquetage contenant des objets dj existants. Ainsi, vous pouvez crer un programmedont la complexit est cache derrire la simplicit des objets.

    4 Chaque objet a un type. Dans le jargon, chaque objet est une instanced'une classe, o classe estsynonyme de type . La caractristique distinctive la plus importante d'une classe est : Quels messagespouvez-vous lui envoyer ? .

    5 Tous les objets d'un type particulier peuvent recevoir les mmes messages. C'est une caractristiquelourde de signification, comme vous le verrez plus tard. Parce qu'un objet de type cercle est galement unobjet de type forme , un cercle garanti d'accepter les messages de forme. Cela signifie que vous pouvezcrire du code qui parle aux formes et qui sera automatiquement accept par tout ce qui correspond ladescription d'une forme. Cette substituabilitest l'un des concepts les plus puissants de la POO.

    1.2 - Un objet dispose d'une interface

    Aristote fut probablement le premier commencer une tude approfondie du concept de type; il parle de laclasse 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 lepremier langage orient objet, Simula-67, avec son mot clef fondamental classqui introduit un nouveau type dansun programme.

    Simula, comme son nom l'indique, a t conu pour dvelopper des simulations telles que "le problme du guichetde 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 duprogramme mis part, sont groups ensemble en tant que classes d'objets et c'est de l que vient le mot clefclass. Crer des types de donnes abstraits (des classes) est un concept fondamental dans la programmation

    Penser en C++ par Bruce Eckel

    - 22 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • oriente objet. On utilise les types de donnes abstraits de manire quasi identique aux types de donnesprdfinis. On peut crer des variables d'un type particulier (appels objetsou instancesdans le jargon orientobjet) et manipuler ces variables (ce qu'on appelle envoyer des messagesou des requtes; on envoie un messageet l'objet se dbrouille pour le traiter). Les membres (lments) d'une mme classe partagent des caractristiquescommunes : 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, lesguichetiers, clients, comptes, transactions, etc. peuvent tous tre reprsents par une unique entit au sein duprogramme. Cette entit est l'objet, et chaque objet appartient une classe particulire qui dfinit sescaractristiques et ses comportements.

    Donc, comme la programmation oriente objet consiste en la cration de nouveaux types de donnes, quasimenttous 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 uneimplmentation 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 flottantepar exemple, dispose d'un ensemble de caractristiques et de comportements. La diffrence est qu'unprogrammeur dfinit une classe pour reprsenter un problme au lieu d'tre forc d'utiliser un type de donnesconu pour reprsenter une unit de stockage de l'ordinateur. Le langage de programmation est tendu enajoutant de nouveaux types de donnes spcifiques nos besoins. Le systme de programmation accepte lanouvelle 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'estqu'une simulation du systme qu'on reprsente, l'utilisation des techniques de la POO peut facilement rduire unensemble 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 commes'ils taient les lments du problme qu'on tente de rsoudre. En fait, l'une des difficults de la programmationoriente objet est de crer une bijection entre les lments de l'espace problme et les lments de l'espacesolution.

    Mais comment utiliser un objet? Il faut pouvoir lui demander d'excuter une requte, telle que terminer unetransaction, dessiner quelque chose l'cran, ou allumer un interrupteur. Et chaque objet ne peut traiter quecertaines requtes. Les requtes qu'un objet est capable de traiter sont dfinies par son interface, et son type estce qui dtermine son interface. Prenons l'exemple d'une ampoule lectrique :

    Ampoule amp;

    Penser en C++ par Bruce Eckel

    - 23 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • amp.allumer();

    L'interface prcise quellesoprations on peut effectuer sur un objet particulier. Cependant, il doit exister du codequelque part pour satisfaire cette requte. Ceci, avec les donnes caches, constitue l' implmentation. Du pointde 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. Cemcanisme est souvent rsum en disant qu'on envoie un message (fait une requte) un objet, et l'objet sedbrouille 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 unobjet Ampoulede s'allumer, de s'teindre, d'intensifier ou de diminuer sa luminosit. Un objet Ampouleest cr endclarant un nom ( amp) pour cet objet. Pour envoyer un message cet objet, il suffit de spcifier le nom de l'objetsuivi de la requte avec un point entre les deux. Du point de vue de l'utilisateur d'une classe prdfinie, c'est peuprs 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 reprsentepar une bote, avec le nom du type dans la partie suprieure, les donnes membres qu'on dcide de dcrire dansla partie du milieu et les fonctions membres(les fonctions appartenant cet objet qui reoivent les messagesenvoys cet objet) dans la partie du bas de la bote. Souvent on ne montre dans les diagrammes UML que lenom de la classe et les fonctions publiques, et la partie du milieu n'existe donc pas. Si seul le nom de la classenous intresse, alors la portion du bas n'a pas besoin d'tre montre non plus.

    1.3 - L'implmentation cache

    Il est utile de diviser le terrain de jeu en crateurs de classe (ceux qui crent les nouveaux types de donnes) etprogrammeurs clients Je suis redevable de mon ami Scott Meyers pour cette formulation.(ceux qui utilisent cestypes de donnes dans leurs applications). Le but des programmeurs clients est de se monter une bote outilspleine de classes rutilisables pour le dveloppement rapide d'applications (RAD, Rapid Application Developmenten anglais). Les crateurs de classes, eux, se focalisent sur la construction d'une classe qui n'expose que lencessaire aux programmeurs clients et cache tout le reste. Pourquoi cela ? Parce que si c'est cach, leprogrammeur client ne peut l'utiliser, et le crateur de la classe peut changer la portion cache comme il l'entendsans se proccuper de l'impact que cela pourrait avoir chez les utilisateurs de sa classe. La portion cachecorrespond en gnral aux donnes de l'objet qui pourraient facilement tre corrompues par un programmeurclient 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 desfrontires respectes par toutes les parties concernes. Quand on cre une bibliothque, on tablit une relationavec un programmeur client, programmeur qui cre une application (ou une bibliothque plus consquente) enutilisant notre bibliothque.

    Si tous les membres d'une classe sont accessibles pour tout le monde, alors le programmeur client peut faire cequ'il veut avec cette classe et il n'y a aucun moyen de faire respecter certaines rgles. Mme s'il est vraimentprfrable que l'utilisateur de la classe ne manipule pas directement certains membres de la classe, sans contrled'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 certainesportions auxquelles ils ne devraient pas avoir accs - les parties qui sont ncessaires pour les manipulationsinternes du type de donnes mais n'appartiennent pas l'interface dont les utilisateurs ont besoin pour rsoudreleur problme. C'est en ralit un service rendu aux utilisateurs car ils peuvent voir facilement ce qui est importantpour 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

    Penser en C++ par Bruce Eckel

    - 24 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentationde 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 del'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/

  • 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 ledveloppement, et se rendre compte plus tard qu'on a besoin de la rcrire afin de gagner en performances. Sil'interface et l'implmentation sont clairement spares et protges, cela peut tre ralis facilement et ncessitesimplement 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. Leursignification et leur utilisation est relativement explicite. Ces spcificateurs d'accsdterminent qui peut utiliser lesdfinitions qui suivent. publicveut dire que les dfinitions suivantes sont disponibles pour tout le monde. Le motclef 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 leprogrammeur client. Si quelqu'un tente d'accder un membre dfini comme private, ils rcupreront une erreurlors de la compilation. protectedse comporte tout comme private, en moins restrictif : une classe drive a accsaux membres protected, mais pas aux membres private. L'hritage sera introduit bientt.

    1.4 - Rutilisation de l'implmentation

    Une fois qu'une classe a t cre et teste, elle devrait (idalement) reprsenter une partie de code utile. Ils'avre que cette rutilisabilit n'est pas aussi facile obtenir que cela ; cela demande de l'exprience et de laperspicacit pour produire une bonne conception. Mais une fois bien conue, cette classe ne demande qu' trerutilise. 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 peutaussi 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 combinaisonncessaire pour que la nouvelle classe puisse raliser ce pour quoi elle a t conue. Parce que la nouvelle classeest 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 unevoiture possde un moteur .

    (Le diagramme UML ci-dessus indique la composition avec le losange rempli, qui indique qu'il y a un moteur dansune 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 sesoucier si l'on utilise l'agrgation ou la composition.)

    La composition s'accompagne d'une grande flexibilit : les objets membres de la nouvelle classe sontgnralement privs, ce qui les rend inaccessibles aux programmeurs clients de la classe. Cela permet de modifierces membres sans perturber le code des clients existants. On peut aussi changer les objets membres lors la phased'exc