c++,c pour les programmeur

630
Claude Delannoy C++ pour les programmeurs C C++ pour les programmeurs C

Upload: kethavath-sakrunaik-k

Post on 05-Jun-2015

650 views

Category:

Engineering


10 download

DESCRIPTION

C++,c pour Les programmer

TRANSCRIPT

  • 1. Claude Delannoy C++pour les programmeurs C C++pour les programmeurs C

2. C++pour les programmeurs C 3. CHEZ LE MME DITEUR Du mme auteur C. Delannoy. Exercices en langage C++. N12201, 3e dition 2007, 336 pages. C. Delannoy. Apprendre le C++. N12135, 2007, 760 pages. C. Delannoy. Programmer en Java (Java 5 et 6). N12232, 5e dition, 780 pages + CD-Rom. C. Delannoy. Exercices en Java (Java 5). N11989, 2e dition, 2006, 330 pages. C. Delannoy. Langage C. N11123, 1998, 944 pages (rdition au format semi-poche). C. Delannoy. Programmer en langage C. Avec exercices corrigs. N11072, 1996, 280 pages. C. Delannoy. Exercices en langage C. N11105, 1997, 260 pages. Autres ouvrages dans la mme collection P. Roques. UML 2 par la pratique. Cours et exercices. N12014, 5e dition 2006, 360 pages. X. Blanc, I. Mounier. UML 2 pour les dveloppeurs. Cours et exercices corrigs. N12029, 2006, 218 pages. H. Bersini, I. Wellesz. Lorient objet. Cours et exercices en UML 2 avec PHP, Java, Python, C# et C++ N12084, 3e dition, 2007, 520 pages. J. Engels. XHTML et CSS : cours et exercices. N11637, 2005, 350 pages. J. Engels. PHP 5 : cours et exercices. N11407, 2005, 518 pages. Autres ouvrages I. Horton. Visual C++ 6. Avec un CD-Rom contenant le produit Microsoft Visual C++ 6 Introductory Edition. N9043, 1999, 1250 pages. G. Leblanc. C# et .NET 2.0. N11778, 2006, 700 pages. E. Daspet et C. Pierre de Geyer. PHP 5 avanc. N12167, 4e dition, 2007, 780 pages. A. Goncalves. Cahier du programmeur Java EE5. N12038, 2007, 330 pages. C. Porteneuve. Bien dvelopper pour le Web 2.0. N12028, 2006, 560 pages. 4. Claude Delannoy C++pour les programmeurs C 5. DITIONS EYROLLES 61, bd Saint-Germain 75240 Paris Cedex 05 www.editions-eyrolles.com Le code de la proprit intellectuelle du 1er juillet 1992 interdit en effet expressment la photocopie usage collectif sans autorisation des ayants droit. Or, cette pratique sest gnralise notamment dans les tablissements denseignement, provoquant une baisse brutale des achats de livres, au point que la possibilit mme pour les auteurs de crer des uvres nouvelles et de les faire diter correctement est aujourdhui menace. En application de la loi du 11 mars 1957, il est interdit de reproduire intgralement ou partiellement le prsent ouvrage, sur quelque support que ce soit, sans autorisation de lditeur ou du Centre Franais dExploitation du Droit de Copie, 20, rue des Grands-Augustins, 75006 Paris. Groupe Eyrolles, 1993-2004, pour le texte de la prsente dition Groupe Eyrolles, 2007, pour la nouvelle prsentation (nouveau titre), ISBN : 978-2-212-12231-2 6e dition 2004, 2e tirage 2007 avec nouvelle prsentation. 6. Dpt lgal : Septembre 2007 N dditeur : 7703 7. Table des matires Avant-propos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXIII Chapitre 1 : Gnralits concernant C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 - La Programmation Oriente Objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1 Problmatique de la programmation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 La programmation structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.3 Les apports de la Programmation Oriente Objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.3.1 Objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.3.2 Encapsulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.3.3 Classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.3.4 Hritage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.3.5 Polymorphisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.4 P.O.O. et langages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2 - C++, C ANSI et P.O.O. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3 - Les spcificits de C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 4 - C++ et la programmation oriente objet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Chapitre 2 : Les incompatibilits entre C++ et C. . . . . . . . . . . . . . . . . . . . . . . . . . 9 1 - Les dfinitions de fonctions en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2 - Les prototypes en C++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3 - Arguments et valeur de retour dune fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.1 Points communs C et C++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 8. C++ pour programmeurs C VI 3.2 Diffrences entre C et C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.2.1 Fonctions sans arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.2.2 Fonctions sans valeur de retour. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4 - Le qualificatif const . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4.1 Porte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4.2 Utilisation dans une expression. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 5 - Compatibilit entre le type void * et les autres pointeurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Chapitre 3 : Les entres-sorties conversationnelles du C++. . . . . . . . . . . . 17 1 - Gnralits. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2 - Affichage lcran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.1 Quelques exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.2 Le fichier en-tte iostream. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.3 Les possibilits dcriture sur cout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3 - Lecture au clavier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.2 Les diffrentes possibilits de lecture sur cin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.3 Exemple classique dutilisation des sparateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.4 Lecture dune suite de caractres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.5 Les risques induits par la lecture au clavier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.5.1 Manque de synchronisme entre clavier et cran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.5.2 Blocage de la lecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.5.3 Boucle infinie sur un caractre invalide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Chapitre 4 : Les spcificits du C++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 1 - Le commentaire de fin de ligne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2 - Dclarations et initialisations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.1 Rgles gnrales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.2 Cas des instructions structures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3 - La notion de rfrence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.1 Transmission des arguments en C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.2 Exemple de transmission dargument par rfrence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.3 Proprits de la transmission par rfrence dun argument. . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.3.1 Induction de risques indirects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.3.2 Absence de conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.3.3 Cas dun argument effectif constant. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.3.4 Cas dun argument muet constant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.4 Transmission par rfrence dune valeur de retour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.4.2 On obtient une lvalue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.4.3 Conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.4.4 Valeur de retour et constance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 9. Table des matires VII 3.5 La rfrence d'une manire gnrale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.5.1 La notion de rfrence est plus gnrale que celle dargument . . . . . . . . . . . . . . . . . . . 38 3.5.2 Initialisation de rfrence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4 - Les arguments par dfaut. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 4.1 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 4.2 Les proprits des arguments par dfaut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 5 - Surdfinition de fonctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 5.1 Mise en uvre de la surdfinition de fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 5.2 Exemples de choix d'une fonction surdfinie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 5.3 Rgles de recherche d'une fonction surdfinie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 5.3.1 Cas des fonctions un argument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 5.3.2 Cas des fonctions plusieurs arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 5.3.3 Le mcanisme de la surdfinition de fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 6 - Les oprateurs new et delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 6.1 Exemples d'utilisation de new . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 6.2 Syntaxe et rle de new . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 6.3 Exemples d'utilisation de l'oprateur delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 6.4 Syntaxe et rle de l'oprateur delete. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 6.5 Loprateur new (nothrow). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 6.6 Gestion des dbordements de mmoire avec set_new_handler . . . . . . . . . . . . . . . . . . . . . . . . 52 7 - La spcification inline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 7.1 Rappels concernant les macros et les fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 7.2 Utilisation de fonctions en ligne. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 8 - Les espaces de noms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 9 - Le type bool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 10 - Les nouveaux oprateurs de cast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Chapitre 5 : Classes et objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 1 - Les structures en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 1.1 Rappel : les structures en C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 1.2 Dclaration d'une structure comportant des fonctions membres . . . . . . . . . . . . . . . . . . . . . . . 63 1.3 Dfinition des fonctions membres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 1.4 Utilisation d'une structure comportant des fonctions membres . . . . . . . . . . . . . . . . . . . . . . . . 65 1.5 Exemple rcapitulatif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 2 - Notion de classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 3 - Affectation dobjets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 4 - Notions de constructeur et de destructeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 4.2 Exemple de classe comportant un constructeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 4.3 Construction et destruction des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 4.4 Rles du constructeur et du destructeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 4.5 Quelques rgles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 10. C++ pour programmeurs C VIII 5 - Les membres donnes statiques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 5.1 Le qualificatif static pour un membre donne. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 5.2 Initialisation des membres donnes statiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 5.3 Exemple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 6 - Exploitation dune classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 6.1 La classe comme composant logiciel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 6.2 Protection contre les inclusions multiples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 6.3 Cas des membres donnes statiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 6.4 En cas de modification dune classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 6.4.1 La dclaration des membres publics na pas chang. . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 6.4.2 La dclaration des membres publics a chang . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 7 - Les classes en gnral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 7.1 Les autres sortes de classes en C++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 7.2 Ce qu'on peut trouver dans la dclaration d'une classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 7.3 Dclaration d'une classe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Chapitre 6 : Les proprits des fonctions membres . . . . . . . . . . . . . . . . . . . . . 91 1 - Surdfinition des fonctions membres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 1.1 Exemple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 1.2 Incidence du statut public ou priv dune fonction membre . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 2 - Arguments par dfaut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 3 - Les fonctions membres en ligne. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 4 - Cas des objets transmis en argument dune fonction membre. . . . . . . . . . . . . . . . . . . . . . . . . . 97 5 - Mode de transmission des objets en argument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 5.1 Transmission de l'adresse d'un objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 5.2 Transmission par rfrence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 5.3 Les problmes poss par la transmission par valeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 6 - Lorsquune fonction renvoie un objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 7 - Autorfrence : le mot cl this. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 8 - Les fonctions membres statiques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 9 - Les fonctions membres constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 9.1 Rappels sur lutilisation de const en C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 9.2 Dfinition dune fonction membre constante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 9.3 Proprits dune fonction membre constante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 10 - Les membres mutables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 Chapitre 7 : Construction, destruction et initialisation des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 1 - Les objets automatiques et statiques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 1.1 Dure de vie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 1.2 Appel des constructeurs et des destructeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 1.3 Exemple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 11. Table des matires IX 2 - Les objets dynamiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 2.1 Les structures dynamiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 2.2 Les objets dynamiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 2.2.1 Points communs avec les structures dynamiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 2.2.2 Les nouvelles possibilits des oprateurs new et delete . . . . . . . . . . . . . . . . . . . . . . . . 117 2.2.3 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 3 - Le constructeur de recopie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 3.1 Prsentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 3.1.1 Il n'existe pas de constructeur appropri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 3.1.2 Il existe un constructeur appropri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 3.1.3 Lorsquon souhaite interdire la contruction par recopie . . . . . . . . . . . . . . . . . . . . . . . 120 3.2 Exemple 1 : objet transmis par valeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 3.2.1 Emploi du constructeur de recopie par dfaut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 3.2.2 Dfinition d'un constructeur de recopie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 3.3 Exemple 2 : objet en valeur de retour d'une fonction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 4 - Initialisation d'un objet lors de sa dclaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 5 - Objets membres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 5.2 Mise en uvre des constructeurs et des destructeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 5.3 Le constructeur de recopie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 6 - Initialisation de membres dans len-tte dun constructeur . . . . . . . . . . . . . . . . . . . . . . . . . . 132 7 - Les tableaux dobjets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 7.1 Notations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 7.2 Constructeurs et initialiseurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 7.3 Cas des tableaux dynamiques d'objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 8 - Les objets temporaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 Chapitre 8 : Les fonctions amies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 1 - Exemple de fonction indpendante amie dune classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 2 - Les diffrentes situations damiti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 2.1 Fonction membre d'une classe, amie d'une autre classe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 2.2 Fonction amie de plusieurs classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 2.3 Toutes les fonctions d'une classe amies d'une autre classe. . . . . . . . . . . . . . . . . . . . . . . . . . . 147 3 - Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 3.1 Fonction amie indpendante. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 3.2 Fonction amie, membre d'une classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 4 - Exploitation de classes disposant de fonctions amies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Chapitre 9 : La surdfinition doprateurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 1 - Le mcanisme de la surdfinition doprateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 1.1 Surdfinition d'oprateur avec une fonction amie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 1.2 Surdfinition d'oprateur avec une fonction membre. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 1.3 Oprateurs et transmission par rfrence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 12. C++ pour programmeurs C X 2 - La surdfinition doprateurs en gnral. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 2.1 Se limiter aux oprateurs existants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 2.2 Se placer dans un contexte de classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 2.3 Eviter les hypothses sur le rle dun oprateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 2.4 Cas des oprateurs ++ et -- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 2.5 Les oprateurs = et & ont une signification prdfinie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 2.6 Les conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 2.7 Choix entre fonction membre et fonction amie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 3 - Exemple de surdfinition de loprateur =. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 3.1 Rappels concernant le constructeur par recopie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 3.2 Cas de laffectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 3.3 Algorithme propos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 3.4 Valeur de retour. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 3.5 En dfinitive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 3.6 Exemple de programme complet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 3.7 Lorsquon souhaite interdire laffectation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 4 - La forme canonique d'une classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 5 - Exemple de surdfinition de l'oprateur [ ] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 6 - Surdfinition de l'oprateur (). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 7 - Surdfinition des oprateurs new et delete. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 7.1 Surdfinition de new et delete pour une classe donne. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 7.2 Exemple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 7.3 Dune manire gnrale. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 Chapitre 10 : Les conversions de type dfinies par lutilisateur . . . . . . . 181 1 - Les diffrentes sortes de conversions dfinies par lutilisateur . . . . . . . . . . . . . . . . . . . . . . . . 182 2 - L'oprateur de cast pour la conversion type classe > type de base . . . . . . . . . . . . . . . . . . . . 184 2.1 Dfinition de l'oprateur de cast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 2.2 Exemple d'utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 2.3 Appel implicite de l'oprateur de cast lors dun appel de fonction . . . . . . . . . . . . . . . . . . . . . 185 2.4 Appel implicite de l'oprateur de cast dans l'valuation d'une expression . . . . . . . . . . . . . . . 187 2.5 Conversions en chane. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 2.6 En cas d'ambigut. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 3 - Le constructeur pour la conversion type de base -> type classe. . . . . . . . . . . . . . . . . . . . . . . . 191 3.1 Exemple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 3.2 Le constructeur dans une chane de conversions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 3.3 Choix entre constructeur ou oprateur d'affectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 3.4 Emploi d'un constructeur pour largir la signification d'un oprateur. . . . . . . . . . . . . . . . . . . 195 3.5 Interdire les conversions implicites par le constructeur : le rle dexplicit. . . . . . . . . . . . . . . 197 4 - Les conversions dun type classe en un autre type classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 4.1 Exemple simple d'oprateur de cast. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 4.2 Exemple de conversion par un constructeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 4.3 Pour donner une signification un oprateur dfini dans une autre classe. . . . . . . . . . . . . . . 200 5 - Quelques conseils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 13. Table des matires XI Chapitre 11 : Les patrons de fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 1 - Exemple de cration et dutilisation dun patron de fonctions . . . . . . . . . . . . . . . . . . . . . . . . 206 1.1 Cration d'un patron de fonctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 1.2 Premires utilisations du patron de fonctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 1.3 Autres utilisations du patron de fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 1.3.1 Application au type char * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 1.3.2 Application un type classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 1.4 Contraintes dutilisation dun patron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 2 - Les paramtres de type dun patron de fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 2.1 Utilisation des paramtres de type dans la dfinition d'un patron . . . . . . . . . . . . . . . . . . . . . 211 2.2 Identification des paramtres de type d'une fonction patron . . . . . . . . . . . . . . . . . . . . . . . . . 212 2.3 Nouvelle syntaxe d'initialisation des variables des types standard. . . . . . . . . . . . . . . . . . . . . 213 2.4 Limitations des patrons de fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 3 - Les paramtres expressions dun patron de fonctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 4 - Surdfinition de patrons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 4.1 Exemples ne comportant que des paramtres de type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 4.2 Exemples comportant des paramtres expressions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 5 - Spcialisation de fonctions de patron. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 5.1 Gnralits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 5.2 Les spcialisations partielles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 6 - Algorithme dinstanciation dune fonction patron. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 Chapitre 12 : Les patrons de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 1 - Exemple de cration et dutilisation dun patron de classes . . . . . . . . . . . . . . . . . . . . . . . . . . 226 1.1 Cration d'un patron de classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 1.2 Utilisation d'un patron de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 1.3 Contraintes dutilisation dun patron de classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 1.4 Exemple rcapitulatif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 2 - Les paramtres de type dun patron de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 2.1 Les paramtres de type dans la cration d'un patron de classes . . . . . . . . . . . . . . . . . . . . . . . 231 2.2 Instanciation d'une classe patron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 3 - Les paramtres expressions dun patron de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 3.1 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 3.2 Les proprits des paramtres expressions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 4 - Spcialisation dun patron de classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 4.1 Exemple de spcialisation d'une fonction membre. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 4.2 Les diffrentes possibilits de spcialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 4.2.1 On peut spcialiser une fonction membre pour tous les paramtres . . . . . . . . . . . . . . 237 4.2.2 On peut spcialiser une fonction membre ou une classe. . . . . . . . . . . . . . . . . . . . . . . . 237 4.2.3 On peut prvoir des spcialisations partielles de patrons de classes . . . . . . . . . . . . . . 237 5 - Paramtres par dfaut. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 6 - Patrons de fonctions membres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 14. C++ pour programmeurs C XII 7 - Identit de classes patrons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 8 - Classes patrons et dclarations damiti. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 8.1 Dclaration de classes ou fonctions "ordinaires" amies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 8.2 Dclaration d'instances particulires de classes patrons ou de fonctions patrons . . . . . . . . . . 240 8.3 Dclaration dun autre patron de fonctions ou de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 9 - Exemple de classe tableau deux indices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 Chapitre 13 : Lhritage simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 1 - La notion dhritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 2 - Utilisation des membres de la classe de base dans une classe drive . . . . . . . . . . . . . . . . . . . 248 3 - Redfinition des membres dune classe drive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 3.1 Redfinition des fonctions membres dune classe drive . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 3.2 Redfinition des membres donnes dune classe drive . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 3.3 Redfinition et surdfinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 4 - Appel des constructeurs et des destructeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 4.1 Rappels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 4.2 La hirarchisation des appels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 4.3 Transmission d'informations entre constructeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 4.4 Exemple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 4.5 Complments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 5 - Contrle des accs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 5.1 Les membres protgs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 5.2 Exemple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 5.3 Intrt du statut protg. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 5.4 Drivation publique et drivation prive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 5.4.1 Rappels concernant la drivation publique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 5.4.2 Drivation prive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 5.5 Les possibilits de drivation protge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 5.6 Rcapitulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 6 - Compatibilit entre classe de base et classe drive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 6.1 Conversion d'un type driv en un type de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 6.2 Conversion de pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 6.3 Limitations lies au typage statique des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 6.4 Les risques de violation des protections de la classe de base . . . . . . . . . . . . . . . . . . . . . . . . . 269 7 - Le constructeur de recopie et lhritage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 7.1 La classe drive ne dfinit pas de constructeur de recopie . . . . . . . . . . . . . . . . . . . . . . . . . . 271 7.2 La classe drive dfinit un constructeur de recopie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 8 - Loprateur daffectation et lhritage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 8.1 La classe drive ne surdfinit pas l'oprateur =. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 8.2 La classe drive surdfinit l'oprateur = . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 9 - Hritage et forme canonique d'une classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 15. Table des matires XIII 10 - Lhritage et ses limites. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 10.1 La situation d'hritage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 10.1.1 Le type du rsultat de l'appel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 10.1.2 Le type des arguments de f . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 10.2 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 10.2.1 Hritage dans pointcol d'un oprateur + dfini dans point . . . . . . . . . . . . . . . . . . . . 280 10.2.2 Hritage dans pointcol de la fonction coincide de point. . . . . . . . . . . . . . . . . . . . . . . 280 11 - Exemple de classe drive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 12 - Patrons de classes et hritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 12.1 Classe "ordinaire" drivant d'une classe patron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 12.2 Drivation de patrons avec les mmes paramtres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 12.3 Drivation de patrons avec introduction dun nouveau paramtre. . . . . . . . . . . . . . . . . . . . 286 13 - Lhritage en pratique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 13.1 Drivations successives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 13.2 Diffrentes utilisations de lhritage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 13.3 Exploitation dune classe drive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 Chapitre 14 : L'hritage multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 1 - Mise en uvre de l'hritage multiple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 2 - Pour rgler les ventuels conflits : les classes virtuelles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 3 - Appels des constructeurs et des destructeurs : cas des classes virtuelles . . . . . . . . . . . . . . . . 298 4 - Exemple dutilisation de lhritage multiple et de la drivation virtuelle . . . . . . . . . . . . . . . 300 Chapitre 15 : Les fonctions virtuelles et le polymorphisme . . . . . . . . . . . 305 1 - Rappel dune situation o le typage dynamique est ncessaire. . . . . . . . . . . . . . . . . . . . . . . . 306 2 - Le mcanisme des fonctions virtuelles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306 3 - Autre situation o la ligature dynamique est indispensable . . . . . . . . . . . . . . . . . . . . . . . . . . 308 4 - Les proprits des fonctions virtuelles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 4.1 Leurs limitations sont celles de lhritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 4.2 La redfinition d'une fonction virtuelle n'est pas obligatoire . . . . . . . . . . . . . . . . . . . . . . . . . 312 4.3 Fonctions virtuelles et surdfinition. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 4.4 Le type de retour dune fonction virtuelle redfinie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 4.5 On peut dclarer une fonction virtuelle dans n'importe quelle classe . . . . . . . . . . . . . . . . . . 314 4.6 Quelques restrictions et conseils. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 4.6.1 Seule une fonction membre peut tre virtuelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 4.6.2 Un constructeur ne peut pas tre virtuel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 4.6.3 Un destructeur peut tre virtuel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 4.6.4 Cas particulier de loprateur daffectation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 5 - Les fonctions virtuelles pures pour la cration de classes abstraites . . . . . . . . . . . . . . . . . . . 317 6 - Exemple dutilisation de fonctions virtuelles : liste htrogne . . . . . . . . . . . . . . . . . . . . . . . 319 7 - Le mcanisme didentification dynamique des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 16. C++ pour programmeurs C XIV 8 - Identification de type l'excution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 8.1 Utilisation du champ name de type_info. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 8.2 Utilisation des oprateurs de comparaison de type_info. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 8.3 Exemple avec des rfrences. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 9 - Les cast dynamiques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329 Chapitre 16 : Les flots. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 1 - Prsentation gnrale de la classe ostream. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 1.1 L'oprateur > n) >> p ; Pour donner une interprtation image (et peu formelle) analogue celle fournie pour cout, nous pouvons dire que la valeur de n est d'abord extraite du flot cin ; ensuite, la valeur de p est extraite du flot cin >> n (comme pour > pour accder des informations de type de base quelconque (sign ou non pour les types entiers) ou des chanes de caract- res1 (char *). Comme avec scanf ou getchar, les caractres frapps au clavier sont, aprs vali- dation par une fin de ligne, enregistrs dans un tampon. La lecture se fait dans ce tampon qui est raliment en cas de besoin dinformations supplmentaires. Les informations du tampon non exploites lors dune lecture restent disponibles pour la lecture suivante. Par ailleurs, une bonne part des conventions d'analyse des caractres lus sont les mmes que celles employes par scanf. Ainsi : les diffrentes informations sont spares par un ou plusieurs caractres parmi ceux-ci2 : es- pace, tabulation horizontale (t) ou verticale (v), fin de ligne (n) ou encore changement de page (f)3 ; un caractre "invalide" pour l'usage qu'on doit en faire (un point pour un entier, une lettre pour un nombre...) arrte l'exploration du flot, comme si l'on avait rencontr un sparateur ; mais ce caractre invalide sera nouveau pris en compte lors d'une prochaine lecture. En revanche, contrairement ce qui se produisait pour scanf, la lecture d'un caractre sur cin commence par "sauter les sparateurs" ; aussi n'est-il pas possible de lire directement ces caractres sparateurs. Nous verrons comment y parvenir dans le chapitre consacr aux flots. 1. Il n'est pas prvu de lire la valeur d'un pointeur ; en pratique, cela n'aurait gure d'intrt et de plus prsenterait de grand risques. 2. On les appelle parfois des "espaces-blancs" (de l'anglais, white spaces). 3. Dans les environnements PC, la fin de ligne est reprsente par deux caractres conscutifs ; elle nen reste pas moins vue par le programme comme un seul et unique caractre (n) ; cette remarque vaut en fait pour tous les fichiers de type texte, comme on le verra dans le chapitre consacr aux flots. 49. 3 - Lecture au clavier 23 3.3 Exemple classique dutilisation des sparateurs Le programme suivant illustre une situation classique dans laquelle la gestion des caractres sparateurs ne pose pas de problme particulier : #include using namespace std ; main() { int n ; float x ; char t[81] ; do { cout > n >> t >> x ; cout