java & c++

Embed Size (px)

Citation preview

  • App

    rend

    reJa

    vaetC+

    +en

    para

    llle

    J.-B

    . Boic

    hat

    97

    82

    21

    21

    24

    03

    3

    Code

    dite

    ur :

    G124

    03

    ISBN

    : 97

    8-2-

    212-

    1240

    3-3

    35E

    Jean-Bernard BoichatIngnieur de dveloppement, Jean-Bernard Boichat est spcialiste en C++, Java, systmes embarqus, mthodologie et technologies Internet. Il travaille actuellementdans le domaine des systmes d'information pour les passagers des transports publics.

    Faire d'une pierre deux coupsJava et C++ sont deux langages la syntaxe trs proche. Grce l'apprentissage de leurs diffrences, dfauts etqualits intrinsques, vous serez mieux prpar pour concevoir un code plus propre, fond sur une vision largiede ces deux langages, de leurs possibilits et de leurs limites.

    Comment est structur ce livre ?L'ouvrage prsente et compare les concepts communs aux langages Java et C++ (dclarations de variables,tableaux...), mais expose galement les particularits de chacun. Les chapitres sont organiss selon un niveau dedifficult croissant, avec exercices corrigs la cl. qui sadresse ce livre ? Aux dbutants en programmation qui souhaitent apprendre les deux langages les plus demands dans le mondeprofessionnel Aux dveloppeurs matrisant l'un des langages et souhaitant s'initier l'autre Aux tudiants en informatique (IUT, 2e cycle, coles d'ingnieurs)Au sommairePremier exemple de programme en Java et en C++ Fichiers den-ttes Fonction dentre main ( ) Compilation etexcution dun programme Dclaration et affectation des variables Oprateurs de condition Boucles for, while etdo Classes en Java et en C++ Tableaux et chanes de caractres Fonctions, mthodes et arguments Mthodesdes classes String en Java et String en C++ Bibliothques et packages Gestion des exceptions en Java et en C++ Entres-sorties : lecture et criture dun fichier Constructeurs dobjets en Java et en C++ Variables et mthodes sta-tiques de classe Clonage dobjet en Java Encapsulation des donnes Hritage et polymorphisme Transtypagedobjet en Java et en C++ Les vector en C++ Passage par valeur et par rfrence Analyse des performances Programmation dinterfaces graphiques Applets et JavaBeans Les templates en C++ et les types gnriques en Java Utilisation de SQL Java Native Interface (JNI) Le langage C# de Microsoft Dvelopper en Java et C++ sous Linux.

    Sur le CD-Rom offert avec ce livre JDK 6 MinGW et MSYS (GNU g++ 3.4.5) NetBeans 6.1 .NET Framework 3.5 Crimson 3.70 Code source des exemples et exercices du livre

    Plate-forme requise : PC avec processeur Pentium 233 MHz ou plus Windows Vista, XP, 2000 ou 2003 512 Mo de RAM 1 Go d'espace disque.

    Sur le site www.editions-eyrolles.com Consultez les mises jour et complments Dialoguez avec l'auteur

    Apprendre

    J avaC++

    parall le

    Jean-Bernard Boichat

    JavaC++

    parallle

    Apprendre

    eten

    4 edition

    4 edition

    4e d

    ition

    4e d

    ition

    boichat 7/10/08 15:42 Page 1

  • JavaC++

    parallle

    Apprendre

    eten

    boichat titre 30/09/08 12:12 Page 1

  • CHEZ LE MME DITEUR

    Ouvrages sur Java

    A. Tasso. Le livre de Java premier langage (5e dition). N12376, 2008, 520 pages + CD-Rom.

    C. Delannoy. Programmer en Java. Java 5 et 6. N12326, 2008, 788 pages (format semi-poche).

    J. BougeaulT. Java - La matrise. Java 5 et 6. N12250, 2008, 550 pages.

    A. PaTricio. Java Persistence et Hibernate. N12259, 2008, 364 pages.

    C. Delannoy. Exercices en Java. Java 5.0. N11989, 2006, 314 pages.

    E. PuyBareT. Les Cahiers du programmeur Java (3e dition). Java 1.4 et 5.0. N11916, 2006, 370 pages + CD-Rom.

    R. Fleury. Les Cahiers du programmeur Java/XML. N11316, 2004, 218 pages.

    P. Haggar. Mieux programmer en Java. 68 astuces pour optimiser son code. N9171, 2000, 256 pages.

    J.-P. reTaill. Refactoring des applications Java/J2EE. N11577, 2005, 390 pages.

    Ouvrages sur C++

    C. Delannoy. C++ pour les programmeurs C. N12231, 2007, 602 pages.

    C. Delannoy. Exercices en langage C++ (3e dition). N12201, 2007, 336 pages.

    C. Delannoy. Apprendre le C++. N12135, 2007, 760 pages.

    H. suTTer. Mieux programmer en C++. N9224, 2000, 215 pages.

  • Jean-Bernard Boichat

    4e dition

    JavaC++

    parallle

    Apprendre

    eten

    boichat titre 30/09/08 12:12 Page 2

  • DITIONS EYROLLES61, bd Saint-Germain75240 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, 2008, ISBN : 978-2-212-12403-3

  • Pour Ornella, qui ma soutenu et cajol durant cet t 2008 pas comme les autres !

    mes chers enfants, Nathalie, Stphanie et Nicolas.

    =Boichat FM.book Page V Vendredi, 26. septembre 2008 12:52 12

  • =Boichat FM.book Page VI Vendredi, 26. septembre 2008 12:52 12

  • Table des matires

    Avant-propos

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXV

    Pourquoi un tel ouvrage ?

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXV

    qui sadresse ce livre ?

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXV

    Quel est lintrt dapprendre plusieurs langages ?

    . . . . . . . . . . . . . . . XXV

    Quelles versions de Java et de C++ ?

    . . . . . . . . . . . . . . . . . . . . . . . . . . . XXVI

    Pourquoi le Standard C++ ?

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXVII

    Comment est prsent cet ouvrage ?

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXVII

    De quel matriel a-t-on besoin ?

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXVII

    Pourquoi autant dexemples et dexercices ?

    . . . . . . . . . . . . . . . . . . . . . XXVIII

    Commentaires et suivi de louvrage

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXVIII

    CHAPITRE 1

    Lincontournable Hello world

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

    Hello world en C++

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

    Hello world en Java

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    La machine virtuelle Java JRE

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    Erreurs de compilation

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

    Notre premier fichier Makefile

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Enfin un premier make effectif. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    Le point dentre main()

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Les paramtres de main() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9main() et C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10main() et Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    =Boichat FM.book Page VII Vendredi, 26. septembre 2008 12:52 12

  • Apprendre Java et C++ en parallle

    VIII

    Analyse comparative. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11Jouer avec Crimson. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    Rsum

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    Exercices

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    CHAPITRE 2

    La dclaration et laffectation des variables numriques

    . . . 15

    Dclaration des variables

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15Choix des noms de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

    Affectation des variables

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

    Transtypage

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

    Positionnement des variables

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

    Variables du type pointeur en C++

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23Utilisation des pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Utilisation de malloc() en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

    Variables constantes

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

    Variables globales en C++

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

    Fichiers den-tte en C++

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    Oprations et oprateurs

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    La classe Java Math

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

    Les oprateurs traditionnels

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

    Char et byte

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

    Intervalles des types entiers en Java

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

    Rgles de priorit des oprateurs

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    Une diversion sur le cin (entre)

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    Les oprateurs daffectation composs

    . . . . . . . . . . . . . . . . . . . . . . . . . . 34

    Les oprations binaires

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    Typedef et numration en C++

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    Rsum

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

    Exercices

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

    =Boichat FM.book Page VIII Vendredi, 26. septembre 2008 12:52 12

  • Table des matires

    IX

    CHAPITRE 3

    Et si on contrlait lexcution ?

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

    Recommandations pour la forme

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

    Oprateurs de condition

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

    Et si ctait faux (False)

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44Loprateur logique NOT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45Prconisation du bool en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

    Les boucles for, while et do

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46Les boucles for en Java partir du JDK 1.5. . . . . . . . . . . . . . . . . . . . . . . . 49

    Tester plusieurs conditions

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49Ceci ET cela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49Optimisation dans le cas de conditions multiples . . . . . . . . . . . . . . . . . . . 50Ceci OU cela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51viter les tests de conditions multiples compliqus. . . . . . . . . . . . . . . . . . 51

    Plusieurs slections avec switch

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

    Linfme goto

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

    Rsum

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

    Exercices

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

    CHAPITRE 4

    On fait ses classes

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

    Notre premire classe en C++

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57Dfinition de la classe Personne. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57Dfinition des objets dune classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59Un seul constructeur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59Une seule mthode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59Nom et dfinition des classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60Code de la classe Personne. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60Directive include . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62Commentaires et documentation des classes . . . . . . . . . . . . . . . . . . . . . . . 63

    Un Makefile volu

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

    Notre premire classe en Java

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66Tester les classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68Commentaires et documentation des classes . . . . . . . . . . . . . . . . . . . . . . . 68

    Cration des objets

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

    =Boichat FM.book Page IX Vendredi, 26. septembre 2008 12:52 12

  • Apprendre Java et C++ en parallle

    X

    Make, javac et redondance

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

    Nos classes Java dans un paquet .jar

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

    Comment tendre notre classe Personne ?

    . . . . . . . . . . . . . . . . . . . . . . . 74

    Diversion sur les structures C

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

    Rsum

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

    Exercices

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

    CHAPITRE 5

    On enchane avec les tableaux

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

    Tableaux dentiers

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

    Copie de tableau dentiers en Java

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

    Tableau dynamique en C++

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

    Tableaux multidimensionnels

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85Le jeu dOthello en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85Le jeu dOthello en C++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86Le cavalier du jeu dchecs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

    Chanes de caractres en C

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

    Les String de Java

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

    Les string du C++, un nouvel atout

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

    Les mthodes des classes String (Java) et string (C++)

    . . . . . . . . . . . . 94

    Rsum

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

    Exercices

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

    CHAPITRE 6

    De la mthode dans nos fonctions

    . . . . . . . . . . . . . . . . . . . . . . . . . . 99

    Fonctions et mthodes

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

    splice() de Perl

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

    splice() comme fonction C

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101Retour par arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101Accs des donnes rptitives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102Retour de fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102Recommandation pour des programmeurs C potentiels. . . . . . . . . . . . . . . 103Comment utiliser nos fonctions C ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103Nos fonctions C dans un module spar. . . . . . . . . . . . . . . . . . . . . . . . . . . 106

    =Boichat FM.book Page X Vendredi, 26. septembre 2008 12:52 12

  • Table des matires

    XI

    Les arguments de mthodes en C++

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107Passage par rfrence (classe C++ Perl1). . . . . . . . . . . . . . . . . . . . . . . . . . 107Paramtres dclars comme const . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109Passage par valeur (classe C++ Perl2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109const et passage par valeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111Passage par pointeur (classe C++ Perl3) . . . . . . . . . . . . . . . . . . . . . . . . . . 112Le suffixe const pour une mthode C++ . . . . . . . . . . . . . . . . . . . . . . . . . . 113

    Fonctions et mthodes inline en C++

    . . . . . . . . . . . . . . . . . . . . . . . . . . . 114Utilisation des numrations avec des mthodes C++ . . . . . . . . . . . . . . . . 116Utilisation des numrations en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

    Les arguments de mthodes en Java

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118splice() avec retour par largument (classe Java Perl1) . . . . . . . . . . . . . . . 118splice() avec retour de mthode (classe Java Perl2) . . . . . . . . . . . . . . . . . . 120

    Java : argument par rfrence ou par valeur ?

    . . . . . . . . . . . . . . . . . . . 121

    Les espaces de noms en C++

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122Utilisation classique du namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123Conflit de nom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123Comment dfinir un espace de noms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

    Fichiers den-tte et namespace

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

    Fichiers den-tte multiples en C++

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

    Rsum

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

    Exercices

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

    CHAPITRE 7

    Notre code dans des bibliothques

    . . . . . . . . . . . . . . . . . . . . . . . . . 129

    Les extensions .jar, .a et .dll

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

    Les packages en Java

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131Compiler les classes de notre package . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133La variable denvironnement CLASSPATH. . . . . . . . . . . . . . . . . . . . . . . . 135Nos classes dans un fichier darchive .jar. . . . . . . . . . . . . . . . . . . . . . . . . . 136Signer et vrifier un fichier .jar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136Test avec le fichier monpaquet.jar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136Rsum des diffrentes tapes avec les fichiers .bat . . . . . . . . . . . . . . . . . 137

    =Boichat FM.book Page XI Vendredi, 26. septembre 2008 12:52 12

  • Apprendre Java et C++ en parallle

    XII

    Les constructions de bibliothques C et C++

    . . . . . . . . . . . . . . . . . . . . . 141Cration dune bibliothque statique en C++ . . . . . . . . . . . . . . . . . . . . . . . 141Utilisation de notre bibliothque C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

    Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

    CHAPITRE 8

    quelques exceptions prs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145Au contraire du C++, Java est n avec les exceptions . . . . . . . . . . . . . . 145Utilisation des exceptions en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

    Capture des exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147Ignorer les exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148Plusieurs exceptions en une seule fois . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150Lancement dune exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151Recommandation pour lcriture de mthodes rutilisables. . . . . . . . . . . . 153Retour avec -1 comme en C ou C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153Cration de nouvelles exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153Nettoyage laide de finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

    Utilisation des exceptions en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156Un exemple sans exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157Un exemple avec exceptions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158Propager les exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161Exception dans la bibliothque Standard C++ . . . . . . . . . . . . . . . . . . . . . . 163

    Gnraliser les exceptions en C++ comme en Java ? . . . . . . . . . . . . . . 164Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

    CHAPITRE 9

    Entres et sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167Du texte dlimit partir de Microsoft Access . . . . . . . . . . . . . . . . . . . 168Lecture de fichiers texte en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

    La mthode getline(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170Lecture de fichiers texte en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172

    Utilisation de la variable separatorChar . . . . . . . . . . . . . . . . . . . . . . . . . . . 173Lecture de fichiers sur Internet en Java . . . . . . . . . . . . . . . . . . . . . . . . . 174

    =Boichat FM.book Page XII Vendredi, 26. septembre 2008 12:52 12

  • Table des matires XIII

    Lecture de fichier binaire en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176criture dun fichier binaire en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

    Compilation conditionnelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179criture dun fichier binaire en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . 181Lecture dun fichier binaire en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183criture dun fichier texte en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185criture dun fichier texte en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

    Le XML pour linformation structure . . . . . . . . . . . . . . . . . . . . . . . . . . . 186criture du fichier XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187

    Accs des rpertoires sur le disque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189Lecture dun rpertoire en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189Lecture dun rpertoire en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191

    Les flux en mmoire (C++) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193sprintf() de la bibliothque C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193istringstream et ostringstream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195Un exemple complet avec divers formatages . . . . . . . . . . . . . . . . . . . . . . . 197Le printf Java du JDK 1.5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199istrstream et ostrstream. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200

    Formatage en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200Filtrer du texte en Java avec StringTokenizer et StreamTokenizer . . 201Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203

    CHAPITRE 10

    Variations sur un thme de classe . . . . . . . . . . . . . . . . . . . . . . . . . . 205Le constructeur par dfaut en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205Le constructeur de copie en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209

    Le constructeur de copie par dfaut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209La forme du constructeur de copie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210Ne pas confondre constructeur et affectation . . . . . . . . . . . . . . . . . . . . . . . 212

    Le constructeur par dfaut en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213Le constructeur de copie en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215Les variables et mthodes statiques dune classe . . . . . . . . . . . . . . . . . 216

    Nous tirons un numro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216

    =Boichat FM.book Page XIII Vendredi, 26. septembre 2008 12:52 12

  • Apprendre Java et C++ en parallleXIV

    En C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216En Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219

    finalize() en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222Un dernier exemple en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223

    CHAPITRE 11

    Manipuler des objets en Java et C++ . . . . . . . . . . . . . . . . . . . . . . . . 225Loprateur = ou un exercice daffectation . . . . . . . . . . . . . . . . . . . . . . 225

    Commenons en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225Poursuivons en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227Crer un oprateur = . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230

    Lincontournable classe string en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . 232Recommandation dordre des mthodes. . . . . . . . . . . . . . . . . . . . . . . . . . . 235Retour la source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236

    Le clonage dobjet en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236Surcharge doprateurs en C++, et nos amis friend . . . . . . . . . . . . . . . 238

    Surcharge doprateur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238Pas de surcharge doprateur en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240Les friend, ces amis qui nous donnent laccs . . . . . . . . . . . . . . . . . . . . . . 241Amis : un exemple plus complet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243Faut-il viter les amis (friend) ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245

    Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248

    CHAPITRE 12

    Un hritage attendu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249Lexemple de java.lang.Integer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249La rutilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251Hritage et composition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251Lencapsulation des donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254La syntaxe de lhritage en Java et C++ . . . . . . . . . . . . . . . . . . . . . . . . . 255Linitialisation des constructeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256

    =Boichat FM.book Page XIV Vendredi, 26. septembre 2008 12:52 12

  • Table des matires XV

    Combiner hritage et composition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260Accs public, priv ou protg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260Le polymorphisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260

    Les Schtroumpfs en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261Les Schtroumpfs en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262Le virtual en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265

    Les classes abstraites en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267Fonction purement virtuelle en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267Destructeur virtuel en C++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269

    Les classes abstraites en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270Le transtypage (casting) dobjet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273

    Le transtypage en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273Comment viter le transtypage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274Le transtypage en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275

    Lhritage en Java et en C++ : les diffrences . . . . . . . . . . . . . . . . . . . . 276Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277

    CHAPITRE 13

    Des hritages multiples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279Hritage multiple en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279Hritage multiple en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282Dfinition dune interface en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283

    Jai dj hrit, que faire avec mon Thread ? . . . . . . . . . . . . . . . . . . . . . . . 284Une interface au lieu dun hritage classique. . . . . . . . . . . . . . . . . . . . . . . 285Des constantes dans une interface Java . . . . . . . . . . . . . . . . . . . . . . . . . . . 286Grouper des constantes dans une interface. . . . . . . . . . . . . . . . . . . . . . . . . 287

    Srialisation et clonage dobjets en Java . . . . . . . . . . . . . . . . . . . . . . . . 287Srialiser des objets Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287Le clonage dobjet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290

    Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292

    =Boichat FM.book Page XV Vendredi, 26. septembre 2008 12:52 12

  • Apprendre Java et C++ en parallleXVI

    CHAPITRE 14

    Devenir collectionneur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293Le vector en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294

    Utiliser un itrateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295Les algorithmes du langage C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296

    La classe vector en C++ et lalgorithme sort() . . . . . . . . . . . . . . . . . . . . . . 298La classe list en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300Linterface List en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301Linterface Set en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304Une liste de tlphone en Java avec HashMap . . . . . . . . . . . . . . . . . . . . 306La mme liste de tlphone avec map en C++ . . . . . . . . . . . . . . . . . . . . 308Les types gnriques en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310

    Un premier exemple simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310Autoboxing et Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312

    Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314

    CHAPITRE 15

    Concours de performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315Comment analyser les performances ? . . . . . . . . . . . . . . . . . . . . . . . . . . 315

    Les outils en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316Les outils en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317

    Gagner en performance : une rude analyse . . . . . . . . . . . . . . . . . . . . . . 320Que peut apporter une meilleure analyse ?. . . . . . . . . . . . . . . . . . . . . . . . . 322

    Passage par valeur ou par rfrence en C++ . . . . . . . . . . . . . . . . . . . . . 322Performance et capacit mmoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324Les entres-sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324

    Lecture de fichiers en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325Influence de lappel de fonctions successives. . . . . . . . . . . . . . . . . . . . . . . 327Lecture de fichiers en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328

    Tests globaux de performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330Avec system() en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330Avec exec() en Java. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331

    =Boichat FM.book Page XVI Vendredi, 26. septembre 2008 12:52 12

  • Table des matires XVII

    Autres calculs de performance ou de contraintes . . . . . . . . . . . . . . . . . 332Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333

    CHAPITRE 16

    Comment tester correctement ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335Le Y2K bug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335Une stratgie de test ds la conception . . . . . . . . . . . . . . . . . . . . . . . . . . 335

    Avec ou sans dbogueur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336Les tests de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336

    La fonction extraction() en C++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337Le programme de test de la fonction extraction () . . . . . . . . . . . . . . . . . . . 338Le programme de test extraction () en Java . . . . . . . . . . . . . . . . . . . . . . . . 340

    Suivre la trace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341Dfinition du problme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341La classe Traceur en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341Tester la classe Traceur en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343La classe Traceur en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344Encore des amliorations pour notre traceur ? . . . . . . . . . . . . . . . . . . . . . . 347

    Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348

    CHAPITRE 17

    Ces fameux patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349Qui sont donc ces fameux patterns ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349Les patterns Singleton et Observer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349Le Singleton ou le constructeur protg . . . . . . . . . . . . . . . . . . . . . . . . . 350

    Le Singleton en Java. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350Le Singleton en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351

    Le pattern Observer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353Java MVC : linterface Observer et la classe Observable . . . . . . . . . . . . . 353Le pattern Observer en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354

    Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356

    =Boichat FM.book Page XVII Vendredi, 26. septembre 2008 12:52 12

  • Apprendre Java et C++ en parallleXVIII

    CHAPITRE 18

    Un livre sur Java sans lAWT ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357Apprendre programmer avec des applications graphiques . . . . . . . 358Le code de notre premire application AWT . . . . . . . . . . . . . . . . . . . . . 358Classes anonymes et classes internes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360

    Sadapter aux vnements traditionnels de lAPI . . . . . . . . . . . . . . . . . . . 362Et si on sadaptait dautres types dvnements ? . . . . . . . . . . . . . . . . . 363

    Applets ou applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365init() et start() pour une applet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369

    Un mot sur les servlets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370get(), set() et les JavaBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370

    Quest-ce quun Bean ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371Beans et C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371

    Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372

    CHAPITRE 19

    Un livre sur C++ sans templates ! . . . . . . . . . . . . . . . . . . . . . . . . . . . 373Les modles ou patrons en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373Un modle de fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374Un modle de classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377

    CHAPITRE 20

    Impossible sans SQL ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379Cration dun fichier dlimit en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . 379Cration dune base de donnes sous Microsoft Access . . . . . . . . . . . . 381

    Activation dODBC - XP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382Activation dODBC - Vista. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384

    Accs ODBC partir de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386Requte SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388

    Cration dune nouvelle table depuis Java . . . . . . . . . . . . . . . . . . . . . . . 389

    =Boichat FM.book Page XVIII Vendredi, 26. septembre 2008 12:52 12

  • Table des matires XIX

    MySQL et Linux : recommandations . . . . . . . . . . . . . . . . . . . . . . . . . . . 391Autres choix dinterfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392

    Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392

    CHAPITRE 21

    Java et C++ main dans la main : le JNI . . . . . . . . . . . . . . . . . . . . . . 393Pourquoi et comment utiliser JNI ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393Des salutations dune bibliothque C++ . . . . . . . . . . . . . . . . . . . . . . . . . 394

    javah pour le code C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395Cration de notre salut.dll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396

    JNI, passage de paramtres et Swing . . . . . . . . . . . . . . . . . . . . . . . . . . . 397Notre interface Swing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401

    Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405

    CHAPITRE 22

    Quelques applications usuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407Coupons et collons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407

    Nous coupons en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408Nous coupons en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411Un exemple de fichier .acr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416Recollons les morceaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416Nous collons en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416Nous collons en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419

    Un message sur notre tlphone mobile . . . . . . . . . . . . . . . . . . . . . . . . . 423Programmons le jeu dOthello . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428

    Les rgles du jeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428La conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428Le jeu dOthello en C++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429Le jeu dOthello en Java. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431

    Suggestions dautres applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436Archiver des fichiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436Tlcharger un site Web entier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436

    Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436

    =Boichat FM.book Page XIX Vendredi, 26. septembre 2008 12:52 12

  • Apprendre Java et C++ en parallleXX

    CHAPITRE 23

    Ltape suivante : le langage C# de Microsoft . . . . . . . . . . . . . . 437Que vient donc faire le C# dans cet ouvrage ? . . . . . . . . . . . . . . . . . . . . 437Un peu dhistoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438

    C++, Java et C# : les diffrences majeures . . . . . . . . . . . . . . . . . . . . . . . . . 439Hello world en C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439Les Makefile avec C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444

    Espace de noms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444Les structures en C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446La classe Personne du chapitre 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449Couper et coller en C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457

    ANNEXES

    ANNEXE A

    Contenu du CD-Rom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461

    ANNEXE B

    Installation des outils de dveloppement pour Java et C++ 463Installation de 7-Zip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464Installation des exemples et des exercices . . . . . . . . . . . . . . . . . . . . . . . . 466Installation du JDK de Sun Microsystems . . . . . . . . . . . . . . . . . . . . . . . 467

    Quest-ce que le JDK ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467Dsinstallation des anciennes versions. . . . . . . . . . . . . . . . . . . . . . . . . . . . 467Tlchargement partir du site Web de Sun Microsystems . . . . . . . . . . . . 467Installation partir du CD-Rom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468

    Installation de MinGW (g++) et MSYS . . . . . . . . . . . . . . . . . . . . . . . . . 471Installation simplifie de MinGW et MSYS. . . . . . . . . . . . . . . . . . . . . . . . 472

    Vrifications finales et dernires mises au point . . . . . . . . . . . . . . . . . . 474Vrification de linstallation des outils . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474Le fameux chapitre 21 avec JNI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476Le fichier source src.jar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478

    =Boichat FM.book Page XX Vendredi, 26. septembre 2008 12:52 12

  • Table des matires XXI

    Installation de la documentation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482Raccourci ou favori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483

    MinGW et MSYS sur Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487Problmes potentiels avec le make et MSYS . . . . . . . . . . . . . . . . . . . . . . . 488

    Les outils Linux de MSYS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489La commande msys.bat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489La commande cd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492Les commandes ls et pwd. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492Copie dans un fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493Emploi du pipe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494Awk, lun des outils essentiels de Linux . . . . . . . . . . . . . . . . . . . . . . . . . . 494Un script de sauvegarde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495

    ANNEXE C

    Installation et utilisation de Crimson . . . . . . . . . . . . . . . . . . . . . . . 499Site Web de Crimson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500

    Rinstallation de Crimson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500Configuration prpare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501Installation partir du CD-Rom. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501

    Association des fichiers Crimson dans lexplorateur . . . . . . . . . . . . 503Installation dun raccourci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505Premier dmarrage de Crimson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505

    Demande dautorisation sous Windows Vista . . . . . . . . . . . . . . . . . . . . . . 506Glisser les fichiers depuis lexplorateur . . . . . . . . . . . . . . . . . . . . . . . . . 507Configuration de Crimson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508

    Configuration des menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510Fermer toutes les fentres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519

    Remarques gnrales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521

    ANNEXE D

    Installation du SDK du Framework de .NET . . . . . . . . . . . . . . . . 523Installation du SDK 3.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523

    =Boichat FM.book Page XXI Vendredi, 26. septembre 2008 12:52 12

  • Apprendre Java et C++ en parallleXXII

    Tlchargement de .NET depuis Internet . . . . . . . . . . . . . . . . . . . . . . . 526Pas de nouveau PATH. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527Vrification de linstallation du .NET Framework SDK . . . . . . . . . . . . . . 528

    Documentation du SDK de .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528Le compilateur du langage C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532Visual C# - Ldition Express. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533

    ANNEXE E

    Apprendre Java et C++ avec NetBeans . . . . . . . . . . . . . . . . . . . . . 535Gnralits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535

    Linux. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536Tlchargement de nouvelles versions . . . . . . . . . . . . . . . . . . . . . . . . . . 536

    Documentations et didacticiels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536Installation partir du CD-Rom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536

    Configuration pour le C++ et le make . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546Prsentation de NetBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547NetBeans et Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547

    Java et la classe Personne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547Nouveau projet avec source existante. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549Distribuer nos applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556Naviguer et dboguer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556Javadoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559UML Diagramme de classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563

    NetBeans et C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565Le jeu dOthello dans NetBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565Cration du projet C++ dans NetBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . 567Dboguer un projet C++ avec NetBeans . . . . . . . . . . . . . . . . . . . . . . . . . . 575

    Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577

    ANNEXE F

    Apprendre Java et C++ avec Linux . . . . . . . . . . . . . . . . . . . . . . . . . . 579Dmarrage de Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580Installation des outils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581

    Vrification de linstallation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582Les exemples du chapitre 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583

    =Boichat FM.book Page XXII Vendredi, 26. septembre 2008 12:52 12

  • Table des matires XXIII

    gedit comme diteur Linux. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585NetBeans sous Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587

    ANNEXE GDans la littrature et sur le Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589

    Dans la littrature . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589Sur le Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591

    Le projet GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592Les compilateurs GNU pour C et C++. . . . . . . . . . . . . . . . . . . . . . . . . . . . 592Les newsgroups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592GNU EMACS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592C++. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593Perl et Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593Le Web lui-mme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593Autres recherches dinformations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594

    Rechercher des sujets de travaux pratiques . . . . . . . . . . . . . . . . . . . . . 594

    Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597

    =Boichat FM.book Page XXIII Vendredi, 26. septembre 2008 12:52 12

  • =Boichat FM.book Page XXIV Vendredi, 26. septembre 2008 12:52 12

  • Avant-propos

    Pourquoi un tel ouvrage ?Les rponses cette question sont multiples. Au cours de cette prface, nous essayeronsdy rpondre sans trop de philosophie et de dbats contradictoires. Nous commenceronspar deux raisons videntes : Ces deux langages de programmation, Java et C++, sont trs semblables, tout au moins

    dans leurs syntaxes. Il est ainsi tout fait possible de reprendre un morceau de code dupremier langage et de lappliquer sans adaptation dans le second.

    Ils sont tous les deux trs populaires dans le monde de linformatique, le premier avecla venue dInternet, le second comme langage systme essentiel.

    Pour assurer une progression constante et logique, au travers dune comparaison directede ces deux langages, il nous a fallu structurer la prsentation du livre en fonction desparticularits de chacun. Cela na pas t facile et nous avons accept le dfi de tenter unetelle exprience. Il a t videmment impossible de couvrir tous les dtails de Java et deC++ car nous avons voulu que cet ouvrage conserve une paisseur raisonnable.

    qui sadresse ce livre ?Nous aimerions dire aux dbutants, mais ce ne serait sans doute pas honnte vis--vis desexperts et des gourous C++, car ce dernier langage est considr comme lun des plusdifficiles assimiler et matriser. Nous pensons aussi aux programmeurs Basic ou,mieux encore, ceux favoriss par leurs connaissances dans des langages plus orientsobjet, comme Delphi, le langage Pascal de Borland ou le C#.Comme autres cas de figure, nous citerons galement les programmeurs Java, Smalltalk,C ou C++ traditionnels qui aimeraient sinitier lun de ces deux langages essentiels etles ajouter leur curriculum vitae.

    Quel est lintrt dapprendre plusieurs langages ?Dans le cas prcis, comme ces deux langages sont trs proches, autant les apprendre enparallle. Un autre aspect, encore plus essentiel, est lapprentissage de leurs diffrences,

    =Boichat FM.book Page XXV Vendredi, 26. septembre 2008 12:52 12

  • Apprendre Java et C++ en parallleXXVI

    de leurs qualits et de leurs dfauts, ce qui nous amnera ainsi programmer en utilisantdes techniques varies et rflchies. Le rsultat sera un code beaucoup plus propre, conuselon une vision plus large des systmes, de leurs possibilits et de leurs limites.

    Pour un programmeur, aussi bien dbutant que professionnel, lapprentissage dunnouveau langage est avant tout enrichissant. Une fonctionnalit manquante dans un langagelamnera une remise en question de ses mthodes. Par exemple, quand un program-meur C++ dcouvre quil nexiste pas de destructeur en Java, il va se poser toute unesrie de questions. En fin de compte, cette rflexion pourra sans aucun doute le conduire rviser ses concepts et crire ses programmes C++ diffremment. De la mmemanire, un programmeur C qui cherche apprendre C++ et Smalltalk en parallle, ce quiest loin dtre une mauvaise ide, va sans doute dcouvrir de nouveaux termes comme celuide variable de classe et se mettra douter de ses vieilles habitudes en programmation C.Enfin, un programmeur qui, en guise de premier exercice en Java, dcide de transfrerune page Web sur son site, va certainement remettre en question ses choix lorsquil devraemployer tel ou tel langage pour ses applications.

    En fin douvrage, dans le dernier chapitre, nous donnerons un aperu du langage deMicrosoft n en 2001, le C#. Nous serons alors surpris de retrouver la plupart des thmesdj abords avec Java et C++ et combien il sera ais alors dcrire un premierprogramme dans ce langage. Le lecteur se rendra compte alors que son bagage informa-tique est dj solide.Dans cet ouvrage, nous parlerons aussi de performances, ainsi que de la manire de vrifieret de tester les programmes. Ces deux aspects font partie de la formation des informati-ciens ; ils sont importants dans lacquisition des mthodes de travail et des connaissancestechniques pour concevoir et dvelopper des applications professionnelles.

    Quelles versions de Java et de C++ ?Il faut tout dabord indiquer que cet ouvrage ne couvre que le bien nomm pure Java .Il en va de mme pour le C++ que nous appelons plus prcisment le Standard C++ .Un grand nombre de fonctions intgres dans le JDK 1.6 (officiellement nomm JDK 6)peuvent tre directement compares celles disponibles dans le Standard C++. Lecode C++ prsent dans cet ouvrage, tout comme le code en Java, devrait de plus pouvoirse compiler et sexcuter dans plusieurs environnements comme Windows ou Linux.

    Les exemples contenus dans ce livre couvrent des domaines varis et parfois complexes.Cependant, le code prsent restera compilable, nous aimerions dire pour lternit, et lache-teur de ce livre naura pas besoin dacqurir une nouvelle dition dans les prochains mois.

    Le langage Java a beaucoup volu ces dernires annes, au contraire du C++ qui aatteint une stabilit naturelle. Aujourdhui, nous parlons de Java 2 (Swing, Beans), Java 5ou Java 6, qui reprsentent les versions de 1.2 1.4, 1.5 et 1.6 respectivement, des JDK deSun Microsystems. Certains concepts et constructions de la version 1.1 ont t remplacspar des techniques plus volues. Dans cet ouvrage, nous laisserons volontairement de

    =Boichat FM.book Page XXVI Vendredi, 26. septembre 2008 12:52 12

  • Avant-propos XXVII

    ct la plupart des mthodes et des classes dprcies des versions antrieures la 1.6.Nous mentionnerons aussi quelques nouveauts apparues depuis la version 1.5.

    Pourquoi le Standard C++ ?Pourquoi avons-nous choisi le Standard C++ et non pas le langage C ou le C++ tradi-tionnel ? Il y a en fait plusieurs raisons cela. La principale concerne les nouvellesbibliothques qui ont t rajoutes partir de 1995 et qui font partie du langage au mmetitre que celles, nombreuses, qui font partie de Java. Comme exemple, nous pourrionsciter la classe string qui nexiste pas dans le C++ classique. Certaines classes des premiresversions du Standard C++ ont t dprcies et corriges dans cette dition.Le Standard C++ est maintenant aussi agr par les standards ANSI et ISO et reprsenteune base encore plus solide pour un langage qui ne devrait plus beaucoup voluer selonles dires de son crateur, Bjarne Stroustrup.

    Comment est prsent cet ouvrage ?Lors de la prsentation des langages, nous commenons en gnral par le C++ et poursui-vons ensuite avec la partie Java. En effet, pourquoi ne serions-nous pas respectueux avecle plus vieux dabord ? En cas de difficults, suivant les connaissances du programmeur,il est tout fait possible de passer plus rapidement sur un sujet et dy revenir par la suite.Pour un programmeur Visual Basic, sinitier en Java et C++ va reprsenter un travailimportant, car la syntaxe sera toute nouvelle pour lui. Dans ce cas-l, il devra sans doutese concentrer dabord sur la partie Java et revenir ensuite sur le C++ avec ses particularitset ses variantes plus complexes.Si nous avions trait lun ou lautre de ces langages sparment, la structure de cet ouvrageaurait t totalement autre. Java et C++ possdent en effet quelques particularits fonci-rement diffrentes qui auraient pu tre exposes dune autre manire. Ici, la difficultprincipale rside dans les premiers chapitres o, pour prsenter des exemples qui tiennentdebout, nous avons souvent besoin de connatre certains aspects du langage qui serontexamins dans les chapitres suivants, et ce tout en traitant en parallle les deux langages.Tous les exemples de code prsents dans les diffrents chapitres ont t compils spar-ment et souvent sous diffrents systmes dexploitation. Ils sont bien videmment prsentssur le CD-Rom accompagnant cet ouvrage.

    De quel matriel a-t-on besoin ?Cet ouvrage est conu pour travailler dans un environnement Windows (XP ou Vista).Dans lannexe F, nous montrerons quil est aussi possible dutiliser Linux.Un systme quip dun processeur cadenc 450 MHz et de 256 Mo de mmoire viveest suffisant pour assurer une compilation des programmes et garantir un environnement

    =Boichat FM.book Page XXVII Vendredi, 26. septembre 2008 12:52 12

  • Apprendre Java et C++ en parallleXXVIII

    agrable pour le dveloppement. Le CD-Rom fourni avec cet ouvrage contient tous lesoutils de dveloppement ncessaires ainsi que NetBeans (voir annexe E) pour Java et C++.Pour pouvoir utiliser correctement NetBeans, un processeur rcent et 1 Go de mmoiresont recommands.Nous trouverons aussi, sur ce mme CD-Rom, un diteur de texte et la version la plusrcente du SDK de la plate-forme Framework .NET de Microsoft qui inclut un compila-teur C#.

    Pourquoi autant dexemples et dexercices ? notre avis, il ny en a jamais assez.Lorsque nous dbutons en programmation, nous commenons par crire de petits morceauxde programmes. Ensuite, nous passons des exercices plus complexes, de petits outilspour grer notre travail ou mme crire de petits jeux intelligents. Lessentiel est dcriredu code, beaucoup de code. Un bon programmeur sera toujours un collectionneurdexemples, dessais et de programmes, quil pourra rapidement retrouver lorsquil enaura besoin.Pratiquement tous les exercices de ce livre sont proposs dans les deux langages, sauf sicela est explicitement indiqu. Les solutions sont disponibles sur le CD-Rom daccompa-gnement. Des Makefile (GNU make) sont disposition pour chaque chapitre et permettentde recompiler le code en cas de besoin.Les exercices ont donn lauteur loccasion de vrifier la consistance et la structure decet ouvrage. Ils peuvent aussi permettre aux lecteurs de suivre les progrs de leur appren-tissage.

    Commentaires et suivi de louvrageLauteur apprcierait de recevoir des commentaires ou des critiques de son ouvrage ladresse lectronique suivante :

    : [email protected]: Java et C++

    Sur le site Web :

    http://www.boichat.ch/javacpp/

    nous pourrons trouver dventuelles corrections dcouvertes dans les exemples et lesexercices, ainsi que des remarques pertinentes ou des difficults rencontres par certainslecteurs. Nous aurons galement notre disposition des informations sur les nouvellesversions des compilateurs et les nouveaux outils, ainsi quune liste de sites et douvragesintressants et recommands. Toutes ces informations seront rgulirement mises jourpar lauteur.

    =Boichat FM.book Page XXVIII Vendredi, 26. septembre 2008 12:52 12

  • 1Lincontournable Hello world

    Nous le retrouvons dans presque tous les ouvrages de programmation. Il vient toujoursen tte ! Ce sera aussi pour nous loccasion de nous familiariser avec lenvironnement dedveloppement. Dans ce chapitre, il sagira tout dabord dditer les fichiers source, savoir hello.cpp et Hello.java.

    Sur le CD-Rom daccompagnement figure un diteur bien pratique pour Windows, quenous pouvons utiliser pour les diffrentes tapes de la programmation de nos exemplesou exercices : lditeur Crimson (voir annexe C). Lenvironnement de Crimson permetdditer les programmes source C++ et Java qui sont des fichiers de texte ASCII, de lescompiler et de les excuter. La compilation et le rsultat de lexcution des programmespeuvent safficher dans une fentre de travail intgre Crimson ; cest donc loutil idalpour cela. Quant aux utilisateurs de Linux, ils ne devraient pas avoir de difficults choisirles outils adapts aux tches dcrites ci-dessous (voir annexe F).Dans ce chapitre, nous allons aussi introduire le fameux make de GNU, qui nous permettradautomatiser la compilation. Avant de pouvoir utiliser le make ainsi que les compilateursJava et C++ et de les intgrer dans lditeur Crimson, il faudra tout dabord installer cesproduits. Ils sont tous disponibles sur le CD-Rom, comme dcrit dans lannexe B. Unautre diteur que Crimson peut videmment tre utilis, mais il faudra alors compiler lesprogrammes avec le make et les excuter dans une fentre DOS (procdures dcrites danslannexe B). Un outil Open Source beaucoup plus complet, NetBeans, peut aussi treutilis (voir les annexes E et F pour son installation et son utilisation travers des exemplescomplets).Nous avons tendu lexercice traditionnel en ajoutant la date, qui sera imprime avecnotre incontournable Hello world .

    =Boichat FM.book Page 1 Vendredi, 26. septembre 2008 12:52 12

  • Apprendre Java et C++ en parallle2

    Hello world en C++La premire tche consiste introduire le code source dans le fichier hello.ccp via lditeurCrimson tel que dcrit dans lannexe C.

    // hello.cpp#include #include

    using namespace std;

    int main(){ time_t maintenant; time(&maintenant);

    cout

  • Lincontournable Hello worldCHAPITRE 1 3

    Le binaire (hello2.exe) serait tout de mme gnr et correctement excutable.Pour en revenir la premire version, les :

    #include #include

    using namespace std;

    vont en effet de pair, et nous les utiliserons tout au long de cet ouvrage. Nous travailleronspresque exclusivement avec les formes sans les .h, cest--dire avec le Standard C++, mmesi, de rares occasions, il nous arrivera dutiliser des .h, cest--dire des fonctions C quine sont pas disponibles dans la bibliothque du Standard C++.

    Les #include et #include sont des fichiers den-ttes ncessaires ladfinition des classes et des objets utiliss. Si time_t, time et ctime ntaient pas introduits,la ligne #include ne serait pas obligatoire.

    Il faut noter que le fichier du Standard C++ contient en fait linclude , quiest un hritage des fonctions C. Nous reviendrons sur la directive include au chapitre 4,section Directive include .

    Dans , nous avons la dfinition de cout et de son oprateur

  • Apprendre Java et C++ en parallle4

    Le fichier hello.exe, nomm parfois excutable binaire, contient le code machine que leprocesseur pourra directement excuter grce aux fonctions du systme dexploitation(DOS ou Linux). Il sexcutera uniquement sur les machines ayant le mme systmedexploitation. Le programme hello.exe peut aussi ne pas fonctionner sur un PC dotdun processeur ancien, car le compilateur naura sans doute pas assur de compatibilitavec les modles antrieurs, par exemple, au Pentium 586 dIntel. Pour fonctionner sousLinux, avec dautres systmes dexploitation ou dautres types de configurations matrielles,il faudra recompiler le programme hello.cpp sur ce type de machine. Un programme Cou C++ compilable sur diffrents supports est communment appel portable. Nous allonsvoir que cela se passe bien diffremment avec Java.

    Hello world en JavaAvant tout, une premire remarque simpose concernant le nom des fichiers. Comme lenom dune classe commence toujours par une majuscule, il est ncessaire de dfinir lenom du fichier selon le mme principe, cest--dire ici Hello.java. Faillir cette rgle estune erreur classique, et la plupart des dbutants tombent dans le pige. En effet, si onoublie ce principe, cette classe ne pourra tre compile :

    import java.util.*;

    public class Hello { public static void main(String[] args) { Date aujourdhui; aujourdhui = new Date(); System.out.println("Hello world en Java: " + aujourdhui); }}

    En Java, le traitement de la date est vraiment trs simple. Nous navons plus des variablesou des structures compliques comme en C ou en C++, mais simplement un objet.aujourdhui est ainsi un objet de la classe Date qui est cr grce loprateur new. Lesdtails de la mthode println sont expliqus plus loin.La compilation seffectue ainsi :

    javac Hello.java

    et nous lexcutons par :java Hello

    ce qui nous donne comme rsultat :Hello world en Java: Mon Mar 31 14:55:44 GMT+02:00 2008

    Nous remarquons ici que nous navons pas de Hello.exe. En effet, le processus se droulediffremment en Java : aprs la compilation de Hello.java, avec javac.exe (qui est,comme pour C++, un excutable binaire diffrent sur chaque systme dexploitation), unfichier compil Hello.class est gnr. Pour excuter Hello.class, nous utilisons le

    =Boichat FM.book Page 4 Vendredi, 26. septembre 2008 12:52 12

  • Lincontournable Hello worldCHAPITRE 1 5

    programme java.exe, qui est la machine virtuelle de Java. Notons quil faut enlever dansla commande lextension .class. java.exe trouvera alors un point dentre main() dansHello.class et pourra lexcuter. Si la classe Hello utilise dautres classes, elles serontcharges en mmoire part la machine virtuelle si ncessaire.Le GMT (Greenwitch Mean Time) pourrait tre diffrent suivant linstallation et la confi-guration du PC, la langue ou encore la rgion. Un CET, par exemple, pourrait treprsent : Central European Time.Une fois que Hello.java a t compil en Hello.class, il est alors aussi possible delexcuter sur une autre machine possdant une machine virtuelle Java, mais avec lamme version (ici 1.6) ou une version suprieure. Le fichier Hello.class sera aussi excu-table sous Linux avec sa propre machine virtuelle 1.6. Si la machine virtuelle ne trouvepas les ressources ncessaires, elle indiquera le problme. Dans certains cas, il faudrarecompiler le code Java avec une version plus ancienne pour le rendre compatible.Nous constatons donc quen Java, le fichier Hello.class ne contient pas de code machinedirectement excutable par le processeur, mais du code interprtable par la machinevirtuelle de Java. Ce nest pas le cas du programme C++ hello.exe, qui utilise directementles ressources du systme dexploitation, cest--dire de Windows. Lapplication hello.exene pourra pas tre excute sous Linux et devra tre recompile (voir les exemples delannexe F).

    La machine virtuelle Java JREDans cet ouvrage, nous devons tout de mme mentionner la machine virtuelle JRE (JavaRuntime Environment) bien que nous allons certainement passer la moiti de notre temps diter et compiler des programmes Java (lautre moiti pour le C++).Sur notre machine de dveloppement, lexcutable java.exe se trouve dans le rpertoireC:\Program Files\Java\jdk1.6.0_06\bin. Si nous examinons le rpertoire C:\ProgramFiles\Java, nous dcouvrirons un second rpertoire nomm jre1.6.0_06 ainsi quunsous-rpertoire bin qui contient galement un fichier java.exe.Nos amis ou clients qui nous livrerons la classe compile Hello.class nauront pasbesoin dinstaller JDK, le kit de dveloppement, mais uniquement la machine virtuelle,cest--dire JRE. Sun Microsystems met disposition diffrentes distributions de JRE,juste pour excuter notre Hello.class :

    "C:\Program Files\Java\jre1.6.0_06\bin\java.exe" Hello

    Hello world en Java: Wed Jul 30 13:58:09 CEST 2008

    et ceci depuis le rpertoire C:\JavaCpp\EXEMPLES\Chap01.

    Le JDK nest ncessaire que pour la compilation, cest--dire lorsque nous utilisons lacommande javac.exe. Sur une mme machine, nous pourrions avoir plusieurs JDK etplusieurs JRE dans le rpertoire C:\Program Files\Java (voir annexe B, section Dsins-tallation des anciennes versions ).

    =Boichat FM.book Page 5 Vendredi, 26. septembre 2008 12:52 12

  • Apprendre Java et C++ en parallle6

    Erreurs de compilationLoubli de la dclaration des ressources est une erreur classique. Si nous effaons lapremire ligne (import java.util.*;) ou si nous la mettons en commentaire (// devant),nous gnrerons lerreur suivante :

    javac Hello.javaHello.java:5: Class Date not found. Date aujourdhui; ^Hello.java:6: Class Date not found. aujourdhui = new Date(); ^2 errors

    Il est noter la manire claire dont le compilateur nous indique la position des erreurs.Ici, il ne trouve pas la classe Date. En ajoutant import java.util.*, nous indiquons aucompilateur dimporter toutes les classes du package (paquet) des utilitaires de Java. Aulieu dimporter toutes les classes du package, nous aurions pu crire :

    import java.util.Date;

    Compiler rgulirement est une trs bonne habitude en Java et C++, en crivant de petitsmorceaux et avant de terminer son code. Le simple oubli dun point-virgule en C++ (quiindique la fin dune instruction) peut entraner une erreur quelques lignes plus loin etfaire perdre inutilement du temps prcieux.

    Notre premier fichier MakefilePour compiler nos programmes Java et C++, nous allons utiliser tout au long de cetouvrage un outil GNU bienvenu : le make. Le fichier Makefile est le fichier utilis pardfaut lorsque la commande make est excute sans paramtre. Cette commande est un hri-tage du monde Unix (Linux) que nous retrouverons aussi avec NetBeans (voir annexe E,section Configuration pour le C++ et le make ). Le Makefile possde une syntaxe trsprcise base sur un systme de dpendances. Le make pourra identifier, en utilisant ladate et lheure, quune recompilation ou une action devra tre excute. Dans le cas defichiers Java, si un fichier .java est plus rcent quun fichier .class, nous devrons consi-drer quun fichier .class devra tre rgnr. Loutil make permet donc dautomatiser ceprocessus.Voici notre tout premier exemple de Makefile, soit le fichier MakefilePremier, dont nousallons expliquer le fonctionnement. Les Makefile sont des fichiers texte ASCII que nouspouvons aussi diter et excuter sous Windows avec lditeur Crimson (voir annexe C)qui va nous simplifier le travail.

    ## Notre premier Makefile#all: cpp java

    =Boichat FM.book Page 6 Vendredi, 26. septembre 2008 12:52 12

  • Lincontournable Hello worldCHAPITRE 1 7

    cpp: hello.exe hello2.exejava: Hello.class

    hello.exe: hello.o g++ -o hello.exe hello.o

    hello.o: hello.cpp g++ -c hello.cpp

    hello2.exe: hello2.o g++ -o hello2.exe hello2.o

    hello2.o: hello2.cpp g++ -c hello2.cpp

    Hello.class: Hello.java javac Hello.java

    clean: rm -f *.class *.o *.exe

    Avant dexcuter ce Makefile, il faudrait sassurer que tous les objets sont effacs. Dansle cas contraire, nous risquons de navoir aucun rsultat tangible ou partiel, bien que celaresterait correct : uniquement les fichiers objets (.o, .exe et .class), dont les sourcesrespectives ont t modifies plus rcemment, seront recompils !Nous aurions pu fournir un fichier efface.bat pour faire ce travail avec les commandesDOS :

    del *.exedel *.odel *.class

    mais nous avons prfr cette version :

    make clean

    Lentre clean (nettoyer) va permettre ici deffacer tous les fichiers .class, .o et .exe (silsexistent) afin que le make puisse rgnrer tous les objets et tous les excutables. Lacommande rm est lquivalent Linux de la commande DOS del et le paramtre f vaforcer leffacement sans demander une quelconque confirmation. Un fichier efface.batest fourni dans chaque rpertoire des exemples et des exercices.Le make clean et sa prsence dans le Makefile sont importants : NetBeans (voir annexe E)en a besoin pour construire ses projets C++.Mentionnons ce message que le lecteur pourrait rencontrer lors de son travail :

    make: *** No rule to make target `clean'. Stop.

    =Boichat FM.book Page 7 Vendredi, 26. septembre 2008 12:52 12

  • Apprendre Java et C++ en parallle8

    Il indique quil ny a pas de rgle (rule) pour le point dentre clean. Nous devrons alorsle rajouter dans le Makefile ou vrifier que la syntaxe du fichier est correcte (espaces etmarques de tabulations tout particulirement).

    Enfin un premier make effectifPour excuter le fichier MakefilePremier, nous devrons entrer la commande :

    make f MakefilePremier

    En navigant dans le rpertoire, nous pourrons constater que les fichiers .o, .exe et .classont t rgnrs. Lerreur sur la recompilation de hello2.cpp rapparatra videmment(voir ci-dessus).Si nous avons un nom de fichier Makefile, comme cest le cas dans tous les chapitres, ilnous faudra simplement excuter :

    make

    Lorsque la commande make est excute, le fichier Makefile sera charg et le pointdentre all excut. La commande make permet aussi de spcifier un point dentre :

    make -f MakefilePremier java

    Ici, uniquement le point dentre java serait activ pour compiler la classe Hello.class.Les points dentre Hello.class ou hello.exe sont aussi possibles pour un choix plusslectif.

    all, cpp et java sont des actions excuter. hello.exe, hello.o et Hello.class sont desfichiers gnrs par les compilateurs. Il faut tre trs attentif avec le format des fichiersMakefile, car ils sont extrmement sensibles la syntaxe. Aprs les deux-points (:), il estprfrable davoir un tabulateur (TAB), bien que nous puissions avoir des espaces, mais surla ligne suivante nous avons toujours des tabulateurs. Suivant la grandeur des variables,nous en aurons un ou plusieurs, mais cela dpend aussi de la prsentation que nous avonschoisie. Aprs les hello.exe: et hello.o:, nous trouvons les dpendances et sur les lignessuivantes les commandes.

    la premire excution du make, cpp et java seront activs, car aucun des hello.o,hello.exe et Hello.class nexiste. En cas derreur de compilation dans hello.cpp, nihello.o ni hello.exe ne seront crs.

    Passons maintenant la partie la plus intressante : si hello.cpp est modifi, sa date seranouvelle et prcdera celle de hello.o. Les deux commandes g++ seront alors excutes.

    Dans ce cas prcis, la sparation en deux parties hello.o et hello.exe nest pas vraimentncessaire, puisque nous navons quun seul fichier hello.cpp. La commande suivantesuffirait :

    g++ -o hello.exe hello.cpp

    =Boichat FM.book Page 8 Vendredi, 26. septembre 2008 12:52 12

  • Lincontournable Hello worldCHAPITRE 1 9

    Enfin, que se passe-t-il si nous dfinissons :hello.o: Hello.java hello.cpp g++ -c hello.cpp

    hello.o sera rgnr si Hello.java a chang et mme si hello.cpp na pas t touch. Onvoit donc que cette dpendance est inutile.Les trois premires lignes du fichier MakefilePremier sont des commentaires. Ilscommencent par le caractre # :

    ## Notre premier Makefile#

    Nous pouvons, par exemple, les utiliser pour liminer des parties de compilation pendantle dveloppement :

    all: cpp #java

    Ici, uniquement la partie C++ sera compile.Nous reviendrons sur les dpendances dues aux fichiers den-tte au chapitre 4. Lesparamtres -c et -o y seront expliqus en dtail.

    Le point dentre main()La fonction main() est le point dentre de tout programme. Le corps de la fonction situeentre les accolades sera excut. En Java, il nest pas possible de dfinir une fonctionindpendante, car elle doit faire partie dune classe. De plus, elle doit tre dclare publicet static. Nous en comprendrons les raisons plus loin dans cet ouvrage. Contrairementau C++, chaque classe en Java peut possder son entre main(). Lorsque nous entrons :

    java Hello

    la mthode main() de la classe Hello.class est active. La classe Hello pourrait utiliserdautres classes possdant aussi un point dentre main(). Nous verrons plus loin quecette technique peut tre employe pour tester chaque classe indpendamment.

    Les paramtres de main()main() peut recevoir des paramtres. Lorsque nous entrons une commande DOS telle que :

    copy hello.cpp hello.bak

    les fichiers hello.cpp et hello.bak sont les deux paramtres reus par la commande copy.Nous allons examiner prsent les diffrences entre les deux langages et la manire deprocder pour tester et acqurir des paramtres. Par exemple, si nous devions programmerla commande DOS copy (quivalente la commande cp sous Linux), il faudrait que nousvrifiions les paramtres de la manire qui va suivre.

    =Boichat FM.book Page 9 Vendredi, 26. septembre 2008 12:52 12

  • Apprendre Java et C++ en parallle10

    main() et C++Le fichier copy_arg.cpp peut se prsenter sous cette forme :

    // copy_arg.cpp#include

    using namespace std;

    int main(int argc, char **argv) { if (argc != 3) { cerr

  • Lincontournable Hello worldCHAPITRE 1 11

    System.out.println("args[0]: " + args[0]); System.out.println("args[1]: " + args[1]); }}

    Ce programme Java peut se compiler avec :javac CopyArgs

    ou un Makefile, combin avec la compilation de la version C++ ci-dessus, qui se trouve surle CD-Rom. La classe CopyArgs.class compile sera excute avec la machine virtuelleJava de cette manire :

    java CopyArgs hello.cpp hello.bak

    Nous obtiendrons le rsultat suivant :args[0]: hello.cppargs[1]: hello.bak

    Analyse comparativeLa premire grande diffrence est le nombre de paramtres retourns, cest--dire un deplus pour la version C++, o nous recevons (dans argv[0]) le nom du programme. Lesstrings existent aussi en Standard C++, mais la fonction main() est un hritage du C.Linstruction if viendra au chapitre 3, mais la traduction de :

    if (argc != 3) {

    serait si argc nest pas gal 3 alors .Les diffrentes sorties lcran, cout et cerr pour C++, ainsi que out et err en Java, sontutilises sur les deux canaux de sorties. Il est possible, plus particulirement sous Linux,de filtrer ces deux sorties pour diffrencier les cas normaux (cout, out) des erreurs (cerr,err). Nous ne donnerons pas ici dexemples sur lutilisation de telles techniques, maisnous garderons cependant lhabitude dutiliser le canal cerr/err pour les erreurs.Observons ce qui se passe avec linstruction :

    cout

  • Apprendre Java et C++ en parallle12

    nous verrions apparatre sous forme hexadcimale ladresse mmoire o se trouve en faitle texte copy_arg.exe . On peut galement concevoir argv comme un tableau de chanesde caractres, le 0 de argv[0] tant un index dans ce tableau.Enfin, le endl est une opration aussi dfinie dans , qui consiste envoyer lecaractre de saut de ligne, que lon reprsente parfois comme le \n ou \010 (valeuroctale).En Java, nous navons pas de chanes de caractres comme en C++, mais un String.Celui-ci est un objet reprsentant aussi une chane de caractres. length est une oprationexcute par le compilateur qui nous permet de recevoir la dimension de la variable args,qui est un tableau de String identifi avec le []. En C et en C++ nous recevons la variableargc. La dimension de args doit tre de 2 dans notre exemple, ce qui nous permet dobtenirles deux paramtres args[0] et args[1]. Lindex commence toujours 0 dans un tableau.Lindex maximal est args.length -1.Lobjet out dans la bibliothque Java System permet de sortir du texte sur la console aumoyen de println(). out, dfini dans le package java.lang.System, est un objet statique dela classe PrintStream ; println() est une mthode (fonction) de la classe PrintStream.Nous verrons ces concepts plus loin. Il nest pas ncessaire dimporter le package Systemavec une instruction