• Aucun résultat trouvé

[PDF] Cours sur le langage C++ apprendre les principaux savoir-faire | Cours informatique

N/A
N/A
Protected

Academic year: 2021

Partager "[PDF] Cours sur le langage C++ apprendre les principaux savoir-faire | Cours informatique"

Copied!
459
0
0

Texte intégral

(1)Programmer en langage C++. C. Delannoy.

(2)

(3) A VANT-PRO PO S. La Program m ation O rie nté e O b je t (e n abré gé P.O .O .) a pour am bition de facilite r l'activité de program m ation, notam m e nt e n pe rm e ttant de déve loppe r de s "com posants logicie ls" ré utilisables . Elle fait appe là des notions fondam e ntales (clas s e s , obje ts, h é ritage , ligature dynam iq ue ou polym orph ism e ...) inconnues de la plupart des langages de program m ation traditionne ls te ls q ue C ou Pascal. Un ce rtain nom bre de langage s ont é té définis de toute s piè ce s pour appliq ue r les conce pts de P.O .O . ; citons Sm alltalk, Sim ula, Eiffe l... (on parle alors de "Langage s O rie nté s O b je t" ou L.O .O .). Le langage C+ + , q uant à lui, a é té conçu suivant une dém arch e q ue lque pe u diffé re nte par B. Stroustrup (AT& T), à partir de s anné e s 19 80 ;son obje ctif a é té , e n e ffe t, d'adjoindre au langage C un ce rtain nom bre de spécificité s lui pe rm e ttant d'appliq ue r les conce pts de P.O .O . Ainsi, C+ + pré s e nte -t-il sur un "vrai L.O .O ." l'originalité d'ê tre fondé s ur un langage ré pandu. Ce ci lais s e au program m e ur toute liberté d'adopte r un "style plus ou m oins orie nté obje t", e n s e s ituant e ntre les deux e xtrê m e s q ue constitue nt la poursuite d'une program m ation classique d'une part, une pure P.O .O . d'autre part. Si une te lle liberté pré s e nte le ris q ue de céder, dans un pre m ie r te m ps, à la facilité e n "m é lange ant les ge nre s " (la P.O .O . ne re nie pas la program m ation classique - e lle l'e nrich it), e lle pe rm e t é galem e nt une "transition e n douce ur" ve rs la P.O .O pure , ave c tout le béné fice q u'on pe ut e n e s com pte r à te rm e . D e s a conce ption jus q u'à sa norm alisation, le langage C+ + a q ue lque pe u é volué . Plus précisém e nt, un ce rtain nom bre de publications de AT& T ont s e rvi de réfé re nce au cours des derniè re s anné e s . Elles s ont connue s s ous la te rm inologie s uivante : ve rsion 1.1 e n 19 86, ve rsion 1.2 e n 19 87, ve rsion 2.0 e n 19 89 , ve rsions 2.1 e t 3 e n 19 9 1 ;ce tte derniè re a s e rvi de bas e au travaildu com ité ANSI q ui, sans la re m e ttre e n caus e , l'a e nrich ie d e q ue lque s e xte nsions et surtout de com posants standard originaux s e pré s e ntant sous form e de fonctions e t de clas s e s gé né riq ue s . Ce t ouvrage e s t destiné à tous ce ux q ui souh aite nt m aî tris e r le langage C+ + , q ue ce s oit dans un but didactiq ue ou e n vue de déve loppe r de vé ritables applications. Conçu sous form e d'un cours, ilsuppose que vous possédez déjà q ue lque s rudim e nts de C1. En e ffe t, ré aliser un livre de taille raisonnable ne né ce s s itant aucune connaissance pré alable nous aurait im m anq uablem e nt conduit à ê tre s uccinct e t, partant, à é lude r les points q ui s e ré vè lent e n ré alité les plus fondam e ntaux lors du déve loppe m e nt de logicie ls e n vraie grande ur. Bie n q ue nous adre s s ant à un public "ave rti", nous avons ch e rch é à re s te r pédagogiq ue . Les diffé re nte s notions, e n particulie r ce lles re lative s aux conce pts de P.O .O , sont introduite s progre s s ive m e nt. Le s "ré fé re nce s avant" ont toujours é té é vité e s , de façon à pe rm e ttre , le cas é ch é ant, une é tude s é q ue ntie lle de 1 - Le cas é ch é ant, on pourra trouve r un cours com pl e t de l angage C dans Program m e r e n langage C du m ê m e aute ur, ch e z l e mê me édite ur..

(4) VI. Program m e r e n langage C+ +. l'ouvrage . Ch aq ue notion e s t illustré e par un program m e com plet, assorti d'un e xe m ple d'exécution m ontrant com m e nt la m e ttre e n œuvre dans un conte xte ré e l. Ce lui-ci pe ut é galem e nt s e rvir : • à une prise de connaissance intuitive ou à une ré vision rapide de la notion e n q ue s tion, • à une e xpé rim e ntation dire cte dans votre propre e nvironne m e nt de travail, • de point de départ à une e xpé rim e ntation pe rsonne lle. Nous avons ch e rch é à ê tre com plet non s e ulem e nt e n couvrant l'e ns e m ble des possibilités du C+ + , m ais é galem e nt e n approfondissant suffisam m e nt ce rtains aspects fondam e ntaux, de m aniè re à re ndre le lecte ur parfaite m e nt opé rationne ldans la conce ption e t le déve loppe m e nt de ses propre s clas s e s . C'e s t ainsi que nous avons large m e nt insisté s ur le rôle du constructe ur de re copie , ainsi que sur la redéfinition de l'opé rate ur d'affe ctation, é lém e nts q ui conduis e nt à la notion de "clas s e canoniq ue ". Toujours dans le m ê m e e s prit, nous avons pris soin de bien déve loppe r les notions avancé e s m ais indispensables q ue s ont la ligature dynam iq ue e t les clas s e s abstraite s , les q ue lles débouch e nt sur la notion la plus puissante du langage q u'e s t le polym orph ism e . De m ê m e , nous avons large m e nt insisté s ur les notions de conte ne ur, d'ité rate ur e t d'algorith m e q ui inte rvie nne nt dans l'utisation de bon nom bre de com posants de la biblioth è q ue s tandard. Note z q ue ce s ouci de com plétude nous a am e né à pré s e nte r de s é lém e nts d'inté rê t lim ité (voire dange re ux !) q ui pe uve nt ê tre ignorés dans un pre m ie r te m ps (notam m e nt dans un cours de C+ + ). Ils sont alors re pé ré s par le pictogram m e $ . Le s ch apitre s les plus im portants ont é té dotés d'exercices 2 com portant : • des suggestions de m anipulations destiné e s à m ie ux vous fam iliaris e r ave c votre e nvironne m e nt ;par e ffe t d'entraî ne m e nt, e lles vous fe ront probablem e nt im agine r d'autre s e xpé rim e ntations de votre cru ; • des program m e s à rédiger ;dans ce cas, un e xe m ple de corre ction e s t fourni e n fin de volum e .. Re m arq ue conce rnant ce tte nouve l l e é dition Les derniè res éditions se basaie nt plutôt sur la ve rsion 3 e t sur le proje t de norm e . Dorénavant, nous nous basons sur la norm e e lle-m ê m e , laq ue lle e s t re connue de la plupart des com pilate urs du m arch é , à q ue lque s détails prè s (q ue nous signalons dans le te xte ). Toute fois, pour vous perm e ttre d'utiliser d'anciens e nvironne m e nts de program m ation, nous m e ntionnons les apports de la norm e par rapport à la ve rsion 3 ainsi que les q ue lques diffé re nce s ave c les ve rsions anté rie ure s . Ces derniè re s ont surtout un caractè re h istoriq ue ;e n particulie r, e lles m e tte nt e n avant les points délicats du langage pour les q ue ls la ge nè s e a é té q ue lque pe u difficile. Par ailleurs, ce tte nouve lle édition a é té e nrich ie d e q uatre ch apitre s s upplém e ntaire s (XVII à XXI) e t d'une anne xe (F) décrivant les nouve aux com posants standard, notam m e nt les conte ne urs e t les algorith m e s .. 2 - D e nom breux autre s e xe rcice s pe uve nt ê tre trouvés dans Exe rcice s e n langage C+ + du m ê m e aute ur, ch e z l e m ê m e édite ur..

(5) I. PRÉSENTA TIO N GÉNÉRA LE D E C+ +. Le langage C+ + a é té conçu (à partir de 19 82) par Bjarne Stroustrup (AT& T Be llLaboratorie s ) ave c un obje ctif pré cis : ajoute r au langage C des "clas s e s " analogue s à ce lles du langage Sim ula. Ils'agissait donc de "gre ffe r" sur un langage classique des possibilités de "Program m ation O rie nté e O b je t". Avant de vous décrire le ré s ultat auq ue la abouti B. Stroustrup, nous com m e nce rons par e xam ine r succincte m e nt ce q u'e s t la Program m ation O rie nté e O b je t d'une m aniè re gé né rale.. 1. LA PRO GRA M M A TIO N O RIENTÉE O BJET 1.1 La probl é m atiq ue de l a program m ation Jus q u'à m ainte nant, l'activité de program m ation a toujours suscité des ré actions dive rs e s allant jus q u'à la contradiction totale. Pour ce rtains, e n e ffe t, ilne s 'agit q ue d'un je u de construction e nfantin, dans leq ue lil suffit d'ench aî ne r de s instructions é lém e ntaire s (e n nom bre re s tre int) pour parve nir à ré s oudre (pre s q ue ) n'im porte q ue lproblèm e . Pour d'autre s au contraire , ils'agit de produire (au s e ns industrie ldu te rm e ) des logicie ls ave c des exige nce s d e q ualité q u'on te nte de m e s ure r suivant ce rtains critè re s ;citons : • l'e xactitude : aptitude d'un logicie l à fournir les ré s ultats voulus, dans des conditions norm ales d'utilisation (par e xe m ple, donné e s corre s pondant aux "spécifications"), • la robuste s s e : aptitude à bien réagir lors q ue l'on s'é carte des conditions norm ales d'utilisation, • l'e xte nsibilité : facilité ave c laq ue lle un program m e pourra ê tre adapté pour satisfaire à une é volution de s spécifications, • la réutilisabilité : possibilité d'utiliser certaine s partie s ("m odules ") du logicie lpour ré s oudre un autre problèm e , • la portabilité : facilité ave c laq ue lle on pe ut e xploite r un m ê m e logicie l dans diffé re nte s im plém e ntations, • l'e fficie nce : te m ps d'exécution, taille m é m oire ....

(6) 2. Pré s e ntation générale de C+ +. La contradiction n'e s t souve nt q u'appare nte e t e s s e ntie llem e nt lié e à l'im portance des proje ts conce rné s . Par e xe m ple, ile s t facile d'écrire un program m e e xact e t robuste lors q u'ilcom porte une ce ntaine d'instructions ; il e n va tout autre m e nt lors q u'il s'agit d'un proje t de dix h om m e s -anné e s ! D e m ê m e , les aspects e xte nsibilité e t ré utilisabilité n'auront guè re d'im portance dans le pre m ie r cas, alors q u'ils s e ront probablem e nt cruciaux dans le s e cond, ne s e rait-ce q ue pour de s raisons économ iq ue s .. 1.2 La program m ation s tructuré e La program m ation structuré e a m anife s te m e nt fait progre s s e r la q ualité de la production de s logicie ls. M ais, ave c le re cul, ilfaut bien reconnaî tre q ue s e s propre s fonde m e nts lui im posaie nt des lim itations "nature lles ". En e ffe t, la program m ation structuré e re posait sur ce q ue l'on nom m e s ouve nt "l'é q uation de W irth ", à savoir : Algorith m e s + Structures de données = Program m e s Bie n sûr, e lle a pe rm is de structure r les program m e s , e t, partant, d'e n am é liore r l'e xactitude e t la robuste s s e . O n avait e s pé ré q u'e lle pe rm e ttrait é galem e nt d'en am é liore r l'e xte nsibilité e t la ré utilisabilité . O r, e n pratiq ue , on s'e s t ape rçu q ue l'adaptation ou la ré utilisation d'un logicie lconduisait souve nt à "cas s e r" le "m odule" inté re s s ant, e t ce ci parce q u'ilé tait né ce s s aire de re m e ttre e n caus e une s tructure de donné e s . Pré cis é m e nt, ce type de difficulté s e s t l'é m anation m ê m e de l'é q uation de W irth q ui dé couple totalem e nt les données des procédures agissant sur ces données.. 1.3 La Program m ation O rie nté e O bje t a)O bje t C'e s t là q u'inte rvie nt la P.O .O . (abré viation de Program m ation O rie nté e O b je t), fondé e juste m e nt sur le conce pt d'objet, à savoir une association des données et des procédures (qu'on appelle alors m é th ode s ) agissant sur ces données. Par analogie ave c l'é q uation de W irth , on pourrait dire q ue l'é q uation de la P.O .O . e s t: M é th ode s + D onné e s = O bje t. b)Encaps ul ation M ais ce tte association e s t plus q u'une s im ple juxtaposition. En e ffe t, dans ce q ue l'on pourrait q ualifie r de P.O .O . "pure "1, on ré alise ce q ue l'on nom m e une encapsul ation des données. Ce la signifie q u'iln'e s t pas possible d'agir dire cte m e nt sur les données d'un obje t ;ile s t né ce s s aire de pas s e r par l'inte rm édiaire de ses m é th ode s q ui joue nt ainsi le rôle d'inte rface obligatoire . O n traduit parfois ce la e n disant q ue l'appe ld'une m é th ode e s t e n fait l'e nvoi d'un "m e s s age " à l'obje t. Le grand m é rite de l'e ncapsulation e s t q ue , vu de l'e xté rie ur, un obje t s e caracté ris e uniq ue m e nt par les spécifications 2 de ses m é th ode s , la m aniè re dont sont ré e llem e nt im planté e s les données étant sans im portance . O n dé crit souve nt une te lle s ituation e n disant q u'e lle ré alise une "abstraction des données" (ce q ui e xprim e bien que les détails concre ts d'im plém e ntation sont cach é s ). A ce propos, on pe ut re m arq ue r 1 - Nous ve rrons, en effe t, q ue l e s conce pts de l a P.O .O . pe uve nt ê tre appl iq ués d'une m aniè re pl us ou m oins rigoure use. En particul ie r, e n C+ + , l 'encapsul ation ne s e ra pas obl igatoire, ce qui ne ve ut pas dire qu'el l e ne s oit pas s ouh aitabl e. 2 - Nom s, argum e nts e t rôl es..

(7) Pré s e ntation générale de C+ +. 3. q u'e n program m ation structuré e , une procédure pouvait é galem e nt ê tre caracté ris é e (de l'e xté rie ur) par s e s spécifications, m ais q ue , faute d'encapsulation, l'abstraction des données n'était pas ré alisée. L'e ncapsulation des données présente un inté rê t m anife s te e n m atiè re d e q ualité de logicie l. Elle facilite considérablem e nt la m ainte nance : une m odification é ve ntue lle de la structure de données d'un obje t n'a d'incide nce q ue s ur l'obje t lui-m ê m e ;les utilisate urs de l'obje t ne s e ront pas conce rné s par la te ne ur de ce tte m odification (ce q ui n'é tait, bie n sûr, pas le cas ave c la program m ation structuré e ). De la m ê m e m aniè re , l'e ncapsulation des données facilite grande m e nt la ré utilisation d'un obje t.. c)Cl as s e En P.O .O . apparaî t gé né ralem e nt le conce pt de clas s e 3. Ce dernie r corre s pond sim plem e nt à la gé né ralisation de la notion de type q ue l'on re ncontre dans les langage s classiques. Une clas s e , e n e ffe t, n'e s t rie n d'autre q ue la description d'un e ns e m ble d'obje ts ayant une s tructure de données com m une 4 e t disposant des m ê m e s m é th ode s . Le s obje ts apparais s e nt alors com m e des variables d'un te ltype clas s e (e n P.O .O ., on dit aussi qu'un obje t e s t une "instance " de sa clas s e ).. d)H é ritage Un autre conce pt im portant e n P.O .O . e s t ce lui d'h é ritage . Ilpe rm e t de définir une nouve lle clas s e à partir d'une clas s e e xistante (q u'on ré utilise en bloc !), à laq ue lle on ajoute de nouve lles données et de nouve lles m é th ode s . La conce ption de la nouve lle clas s e , q ui "h é rite " des propriété s e t des aptitudes de l'ancie nne , pe ut ainsi s'appuye r sur des réalisations anté rie ure s parfaite m e nt au point e t les "spécialiser" à volonté . Com m e on pe ut s'e n doute r, l'h é ritage facilite large m e nt la ré utilisation de produits e xistants, e t ce ci d'autant plus q u'ilpe ut ê tre ré ité ré autant de fois q ue né ce s s aire (la clas s e C pe ut h é rite r de B, q ui e llem ê m e h é rite de A)5.. 1.4 P.O .O . e t l angage s Nous ve nons d'énoncer les grands principes de la P.O .O ., d'une m aniè re gé né rale, sans nous attach e r à un langage particulie r. O r, m anife s te m e nt, ce rtains langage s pe uve nt ê tre conçus (de toute s piè ce s ) pour appliq ue r à la lettre ce s principe s e t ré aliser ce que nous nom m ons de la P.O .O . "pure ". C'e s t, par e xe m ple, le cas de Sim ula, Sm alltalk ou, plus ré ce m m e nt Eiffe l. Le m ê m e ph é nom è ne a e u lie u, e n son te m ps, pour la program m ation structuré e ave c Pascal. A l'oppos é , on pe ut toujours te nte r d'appliq ue r, ave c plus ou m oins de bonh e ur, ce q ue nous aurions te ndance à nom m e r "une ph ilosoph ie P.O .O ." à un langage classique (Pascal, C...). O n re trouve là une idée com parable à ce lle q ui consistait à appliq ue r les principes de la program m ation structuré e à des langage s com m e Fortran ou Basic. Le langage C+ + s e s itue à m i-ch e m in e ntre ces deux points de vue . Ila, e n e ffe t, é té obte nu e n ajoutant à un langage classique (C) les outils perm e ttant de m e ttre e n œuvre tous les principes de la P.O .O . Program m e r e n C+ + va donc plus loin q u'adopte r une ph ilosoph ie P.O .O . e n C, m ais m oins loin q ue de faire de la P.O .O . pure ave c Eiffe l!. 3 - D ans ce rtains l angages (Turbo Pas cal , par e xe m pl e ), l e m ot cl as s e e s t re m pl acé par obje t e t l e m ot obje t par variabl e. 4 - Bie n e nte ndu, seul e l a s tructure e s t com m une, l es données étant propre s à ch aq ue obje t. Le s m é th odes, par contre, sont e ffe ctive m e nt com m une s à l 'ensem bl e des obje ts d'une m ê m e cl asse. 5 - En C+ + , l e s te ch niq ues de m é th odes virtue l l es él argis s e nt e ncore pl us l a portée de l 'h é ritage ;m ais iln'e s t pas possibl e, pour l 'instant, d'en faire pe rce voir l 'inté rê t..

(8) 4. Pré s e ntation générale de C+ +. La solution adopté e par B. Stroustrup a le m é rite de pré s e rve r l'e xistant (com patibilité ave c C+ + de program m es déjà é crits e n C) ;e lle pe rm e t é galem e nt une "transition e n douce ur" de la program m ation structuré e ve rs la P.O .O . En re vanch e , e lle n'im pos e nullem e nt l'application stricte des principes de P.O .O . Com m e vous le ve rre z, e n C+ + , rie n ne vous e m pê ch e ra (sauf votre bon sens !) de faire coh abite r de s obje ts (dignes de ce nom , parce q ue ré alisant une parfaite e ncapsulation de leurs données), ave c des fonctions classiques réalisant des effe ts de bord sur des variables globales .... 2. C+ + , C ANSI ET P.O .O .. Pré cédem m e nt, nous avons dit, d'une façon q ue lque pe u sim pliste , q ue C+ + s e pré s e ntait com m e un "sure ns e m ble" du langage C, offrant des possibilités de P.O .O . Il nous faut m ainte nant nuance r ce tte affirm ation. D 'une part, lors q ue l'on parle de sur-e ns e m ble du C, nous nous réfé rons au langage C te lq u'ile s t défini par la norm e ANSI6. O r, e n fait, ile xiste q ue lque s incom patibilité s e ntre le C ANSI e t le C+ + . Ce lles -ci, com m e nous le ve rrons, sont né anm oins re lative m e nt m ine ure s ;e lles s ont, pour la plupart, due s à la diffé re nce "d'esprit" des deux langage s , ainsi qu'à la tolérance dont a fait pre uve la norm e ANSI e n ch e rch ant à "pré s e rve r l'e xistant" (ce rtaine s tolérance s ont disparu e n C+ + ). D 'autre part, les e xte nsions du C+ + par rapport au C ANSI ne s ont pas toute s vé ritablem e nt lié e s à la P.O .O . Ce rtaines de ce s e xte nsions, en effe t, pourraie nt ê tre ajouté e s ave c profit au langage C, sans q u'il devie nne pour autant "orie nté obje t"7. En fait, nous pourrions caracté ris e r C+ + par ce tte form ule : C+ + = C + E + S + P. dans laq ue lle : C désigne le C norm e ANSI, E re pré s e nte les "é carts à la norm e " de C+ + , S re pré s e nte les s pé cificités de C+ + q ui ne s ont pas vé ritablem e nt axé e s s ur la P.O .O ., P re pré s e nte les possibilités de P.O .O .. 3. LES INCO M PA TIBILITÉS D E C+ +. A VEC LE C ANSI. Le s principaux "é carts à la norm e " sont décrits dans le ch apitre II ;ils sont accom pagnés de rappe ls conce rnant la norm e C ANSI. Ils conce rne nt e s s e ntie llem e nt : • les définitions de fonctions : e n-tê te s , prototype s , argum e nts e t valeur de re tour, • la portée du q ualificatif cons t, • les com patibilité s e ntre pointe urs. 6 - Laq ue l l e a s e nsibl e m e nt é vol ué, par rapport à l a dé finition initial e du l angage C, ré al isée en 1978, par Kernigh an e t R itch ie. 7 - D'ail l e urs, certaine s e xte nsions de C+ + , par rapport à l a pre m iè re définition du C, ont é té introduites dans l e C ANSI (prototypes, fonctions à argum e nts variabl es...)..

(9) Pré s e ntation générale de C+ +. 5. Ilfaut note r q ue ce s incom patibilité s s ont re s té e s les m ê m e s au fildes diffé re nte s ve rsions de C+ + .. 4. LES SPÉCIFICITÉS D E C+ + Com m e nous l'avons dit, C+ + pré s e nte , par rapport au C ANSI, de s e xte nsions q ui ne s ont pas vé ritablem e nt orie nté e s P.O .O . Elles s e ront décrites dans le ch apitre IV. En voici un bref résum é : • nouve lle form e de com m e ntaire (e n fin de ligne ), • plus grande liberté dans l'e m place m e nt des déclarations, • notion de ré fé re nce facilitant la m ise en œuvre de la transm ission d'argum e nts par adre s s e , • surdéfinition de s fonctions : attribution d'un m ê m e nom à diffé re nte s fonctions, la re connaissance de la fonction ré e llem e nt appe lée s e faisant d'aprè s le type e t le nom bre des argum e nts figurant dans l'appe l (on parle parfois de signature ), • nouve aux opé rate urs de gestion dynam iq ue de la m é m oire : ne w e t de lete , • possibilité de définir de s fonctions "e n ligne " (inline ), ce q ui accroî t la vitesse d'e xé cution, sans perdre pour autant le form alism e des fonctions.. 5. C+ +. ET LA PRO GRA M M A TIO N O RIENTÉE O BJET. Le s possibilités de P.O .O . re pré s e nte nt, bie n sûr, l'e s s e ntie lde l'apport de C+ + . C+ + dispose de la notion de clas s e (gé né ralisation de la notion de type défini par l'utilisate ur). Une clas s e com porte ra : • la description d'une s tructure de données, • des m é th ode s . Sur le plan du vocabulaire , C+ + utilise des te rm e s q ui lui sont propre s . O n parle, e n e ffe t : • de "m e m bres donnée" pour dé s igne r les diffé re nts m e m bres de la structure de données associé e à une clas s e , • de "fonctions m e m bre " pour dé s igne r les m é th ode s . A partir d'une clas s e , on pourra "instancie r" de s obje ts (nous dirons généralem e nt cré e r de s obje ts) : • soit par des déclarations usuelles (de type clas s e ), • soit par allocation dynam iq ue , e n faisant appe lau nouve lopé rate ur ne w . C+ + pe rm e t l'e ncapsulation des données, m ais ilne l'im pos e pas. O n pe ut le re gre tte r m ais ilne faut pas pe rdre de vue q ue , de par sa conce ption m ê m e (e xte nsion de C), le C+ + ne pe ut pas, de toute façon, ê tre un langage de P.O .O . pure . Bie n e nte ndu, ilre s te toujours possible au conce pte ur de faire pre uve de rigue ur, e n s'astre ignant à ce rtaine s rè gles te lles q ue l'e ncapsulation absolue . C+ + pe rm e t de définir ce q ue l'on nom m e des "constructe urs" de clas s e . Un constructe ur e s t une fonction m e m bre particuliè re q ui e s t e xé cuté e au m om e nt de la cré ation d'un obje t de la clas s e . Le constructe ur pe ut notam m e nt pre ndre e n ch arge "l'initialisation d'un obje t", au s e ns le plus large du te rm e , c'e s t-à -dire s a m ise dans un état initialpe rm e ttant son bon fonctionne m e nt ulté rie ur ;ilpe ut s'agir de banales initialisations de m e m bres donnée, m ais é galem e nt d'une pré paration plus é laboré e corre s pondant au dé roulem e nt d'instructions, voire d'une allocation dynam iq ue d'em place m e nts néce s s aire s à l'utilisation de l'obje t..

(10) 6. Pré s e ntation générale de C+ +. L'e xiste nce d'un constructe ur garantit q ue l'obje t s e ra toujours initialisé, ce qui constitue m anife s te m e nt une s é curité . D 'une m aniè re s im ilaire , une clas s e pe ut disposer d'un "destructe ur", fonction m e m bre e xé cuté e au m om e nt de la destruction d'un obje t. Ce lle-ci pré s e nte ra surtout un inté rê t dans le cas d'obje ts e ffe ctuant des allocations dynam iq ues d'em place m e nts ;ces dernie rs pourront ê tre libérés par le destructe ur. Une des originalités de C+ + , par rapport à d'autre s langages de P.O .O ., ré s ide dans la possibilité de définir des "fonctions am ies d'une clas s e ". Ils'agit de fonctions "usuelles " (q ui ne s ont donc pas des fonctions m e m bre d'une clas s e ) q ui sont autoris é e s (par une clas s e ) à accéder aux donné e s (e ncapsulée s ) de la clas s e . Ce rte s , le principe d'encapsulation e s t violé, m ais uniq ue m e nt par de s fonctions dûm e nt autoris é e s à le faire . La clas s e e s t un type défini par l'utilisate ur. La notion de "surdéfinition d'opé rate urs" va pe rm e ttre de dote r ce tte classe d'opérations analogue s à ce lles q ue l'on re ncontre pour les type s prédéfinis. Par e xe m ple, on pourra dé finir une clas s e com plexe (destiné e à re pré s e nte r de s nom bre s com plexe s ) e t la m unir de s opé rations d'addition, de s oustraction, de m ultiplication e t de division. Qui plus e s t, ce s opé rations pourront utiliser les sym boles e xistants : + , -, *, /. C dispose de possibilités de conve rsions (explicite s ou im plicite s ). C+ + pe rm e t d'élargir ce s conve rsions aux types définis par l'utilisate ur q ue s ont les clas s e s . Par e xe m ple, on pourra donne r un s e ns à la conve rsion int -> com plexe ou à la conve rsion com plexe -> float (com plexe é tant une clas s e ). Nature llem e nt, C+ + dispose de l'h é ritage e t m ê m e (depuis la ve rsion 2.0) de possibilités dite s "d'h é ritage m ultiple" pe rm e ttant à une classe d'h é rite r sim ultané m e nt de plusieurs autre s . En m atiè re d'entré e s -sortie s , C+ + com porte de nouve lles possibilités bas é e s s ur la notion de "flot". Le urs avantage s s ur les e ntré e s -sorties de C sont, e n particulie r : • sim plicité d'utilisation, • taille m é m oire réduite (on n'introduit q ue ce q ui e s t utile), • possibilité de leur donne r un s e ns pour les types définis par l'utilisate ur q ue s ont les clas s e s (grâ ce au m é canism e de surdé finition d'opé rate ur). Bie n q u'e lles s oie nt lié e s à l'aspect P.O .O ., nous fe rons une prem iè re pré s e ntation de ce s nouve lles possibilités d'entré e s -sorties dè s le ch apitre III. Ce ci nous perm e ttra de ré aliser rapidem e nt des program m e s dans l'e s prit du C+ + . D ans ses derniè re s ve rsions, le C+ + a é té doté de la notion de patron. Elle pe rm e t de définir de s m odè les utilisables pour gé né re r diffé re nte s clas s e s ou diffé re nte s fonctions q ualifié e s parfois de génériques, m ê m e s i ce tte gé né ricité n'e s t pas totalem e nt inté grée dans le langage lui-m ê m e com m e c'e s t par e xe m ple le cas ave c ADA. Enfin, la norm e ANSI a notablem e nt accru le conte nu de la biblioth è q ue s tandard de C+ + q ui vie nt com pléte r ce lle du C, toujours disponible. En particulie r, on y trouve des nom bre ux patrons de clas s e s e t de fonctions perm e ttant de m e ttre e n œuvre les s tructures de données et les algorith m e s les plus usuels, é vitant ainsi d'avoir à ré inve nte r la roue à la m oindre occasion..

(11) II. LES INCO M PA TIBILITÉS D E C+ + A VEC LE C ANSI. A priori, le langage C+ + pe ut ê tre considéré com m e une e xte nsion du langage C, te lq u'ile s t défini par la norm e ANSI. Tout program m e é crit e n C de vrait donc pouvoir ê tre traduit corre cte m e nt par un com pilate ur C+ + e t son exécution de vrait alors fournir les m ê m e s ré s ultats q ue ce ux obte nus e n utilisant un com pilate ur C. Ce point de vue corre s pond e ffe ctive m e nt au souh ait du conce pte ur du langage C+ + . Né anm oins, e n pratiq ue , un ce rtain nom bre "d'incom patibilité s " ave c le C ANSI ont subsisté , Elles s ont e s s e ntie llem e nt inh é re nte s à l'e s prit m ê m e dans leq ue lles deux langage s ont é té conçus. Nous allons décrire ici les incom patibilité s les plus im portante s e n pratiq ue , e n particulie r ce lles q ui s e ré vé leraie nt q uasim e nt à coup sûr dans la m ise au point de vos prem ie rs program m e s C+ + . A ce propos, note z q ue nous aurions pu nous conte nte r de "cite r" ce s incom patibilité s . Né anm oins, ce lles -ci sont définie s par rapport au C ANSI ;e lles conce rne nt, pour la plupart, des possibilité s q ui n'e xistaie nt pas dans la pre m iè re définition de K e rningh an e t R itch ie e t q ui ne s ont donc pas (e ncore ) re connues de toute s les im plém e ntations du C. Aussi, en profitons-nous pour vous e xpos e r (ou rappe ler) ce q ue s ont ce s possibilité s du C ANSI, e n m ê m e te m ps q ue nous vous m ontrons ce q u'e lles s ont deve nue s e n C+ + . Par ailleurs, q ue lque s autre s incom patibilité s m ine ure s s e ront abordé e s au fildes proch ains ch apitre s ;e lles s e ront toute s ré capitulées dans l'anne xe B.. 1. LES D ÉFINITIO NS D E FO NCTIO NS EN C+ + Suivant la norm e ANSI, ile xiste e n C de ux façons de définir1 une fonction. Suppos e z, par e xe m ple, q ue nous ayons à définir une fonction nom m é e fe xple, fournissant une valeur de re tour2 de type double e t re ce vant deux argum e nts, l'un de type int, l'autre de type double. Nous pouvons, pour ce la, procéder de l'une des deux façons suivante s : double fexple (u, v) int u ; double v ;. double fexple (int u, double v) { .... 1 - Ne confondez pas l a "dé finition" d'une fonction q ui corre s pond à l a de s cription, à l 'aide d'instructions C, de "ce q ue fait" une fonction ave c s a "dé cl aration" q ui corre s pond à une s im pl e inform ation (nom de l a fonction e t, éve ntue l l e m e nt, type des argum e nts e t de l a val e ur de retour) fournie au com pil ate ur. 2 - O n parl e é gal e m e nt de "ré s ul tat fourni par l a fonction", de "val e ur re tourné e "....

(12) 8. Program m e r e n langage C+ + {. ... .... /* corps de la fonction */. /* corps de la fonction */. }. }. La pre m iè re form e é tait la s e ule pré vue par la définition initiale de Kernigh an e t R itch ie . La s e conde a é té introduite par la norm e ANSI q ui n'a, toute fois, pas e xclu l'ancie nne 3. Le langage C+ + n'acce pte , q uant à lui, q ue la s e conde form e : double fexple (int u, double v) { ... /* corps de la fonction */ }. R e m arque : Com m e e n C ANSI, lors q u'une fonction fournit une valeur de type int, le m ot int pe ut ê tre om is dans l'e n-tê te . Nous ne vous cons e illons guè re , toute fois, d'e m ploye r ce tte possibilité q ui nuit à la lisibilité des program m e s .. 2. LES PRO TO TYPES EN C+ + Nous ve nons de voir q ue le C+ + é tait plus re s trictif q ue le C ANSI e n m atiè re de définition de fonctions. Il e n va de m ê m e pour les déclarations de fonctions. En C ANSI, lors q ue vous utilisiez une fonction q ui n'avait pas é té définie auparavant dans le m ê m e fich ie r source , vous pouvie z : • ne pas la déclare r (on considérait alors q ue s a valeur de re tour é tait de type int), • la déclare r e n ne pré cisant q ue le type de la valeur de re tour, par e xe m ple : double fexple ;. • la déclare r à l'aide de ce q ue l'on nom m e un "prototype ", par e xe m ple : double fexple (int, double) :. En C+ + , un appe lde fonction ne s e ra acce pté q ue s i le com pilate ur connaî t le type des argum e nts e t ce lui de sa valeur de re tour. Ce q ui signifie q ue la fonction e n q ue s tion doit avoir fait l 'objet d'une décl aration sous form e d'un prototype (ou, à la rigue ur, avoir é té pré alablem e nt définie dans le m ê m e fich ie r source 4). N'oublie z pas q ue , à ch aq ue fois q ue le com pilate ur re ncontre un appe lde fonction, ilcom pare les types des "argum e nts e ffe ctifs" ave c ce ux de s argum e nts m ue ts corre s pondants 5. En cas de diffé re nce , ilm e t e n place les conve rsions nécessaires pour que la fonction re çoive des argum e nts du bon type . Le s conve rsions possibles ne s e lim ite nt pas aux "conve rsions non dégradante s " (te lles q ue , par e xe m ple, ch ar -> double, int -> long). En e ffe t, e lles com porte nt toute s les conve rsions autoris é e s lors d'une affe ctation. O n pe ut donc y re ncontre r de s "conve rsions dégradante s " te lles q ue , par e xe m ple, int -> ch ar, double -> float, double -> int, ... Voici un e xe m ple illustrant ce point :. 3 - D ans l e s e ulbut de rendre com patibl e ave c l a norm e, des ancie ns program m e s ou des anciens com pil ate urs. 4 - Toute fois, m ê m e dans ce cas, l e prototype reste cons e il l é, notam m e nt pour é vite r tout probl è m e e n cas d'écl ate m e nt du fich ie r s ource. 5 - Nous supposons que l e com pil ate ur connaî tl e type des argum e nts de l a fonction, ce q ui e s t toujours l e cas e n C+ + ..

(13) II. Le s incom patibilité s d e C+ + ave c le C ANSI 9 _______________________________________________________________________________ ______ double fexple (int, double) ; ..... main() { int n ; char c ; double z, res1, res2, res3 ; ..... res1 = fexple (n, z) ; res2 = fexple (c, z) ; res3 = fexple (z, n) ;. /* déclaration de fexple */. /* appel "normal" - aucune conversion */ /* conversion, avant appel, de c en int */ /* conversion, avant appel, de z en int */ /* et de n en double */. ..... } _______________________________________________________________________________ ______ Exe m ple de conve rsions de type s lors d e l'appe ld'une fonction. R e m arques 1) Lors q ue la définition de la fonction e t sa déclaration (sous form e d'un prototype ) figure nt dans le m ê m e fich ie r source , le com pilate ur e s t e n m e s ure de vé rifie r la coh é re nce e ntre l'e n-tê te de la fonction e t le prototype . S'iln'y a pas corre s pondance (e xacte ce tte fois) de type , on obtie nt une e rre ur de com pilation. Voici un e xe m ple corre ct : double fexple (int, double) ; main() { ..... } /* définition de fexple double fexple (int u, double v) { /* corps de la fonction */ }. /* déclaration de fexple */. */. En re vanch e , ce lui-ci conduit à une e rre ur de com pilation : double fexple (int, float) ; /* déclaration de fexple */ main() { ..... } /* définition de fexple */ double fexple (int u, double v) { /* corps de la fonction */ }. Bie n e nte ndu, si la définition de la fonction e t sa déclaration (donc son utilisation6) ne figure nt pas dans le m ê m e fich ie r source , aucun contrôle ne pe ut plus ê tre e ffe ctué par le com pilate ur. En gé né ral, 6 - A m oins q u'on ne l 'ait décl arée, sans l 'util iser, ce qui arrive fré q ue m m e nt l ors q ue l 'on fait appe là des fich ie rs e n-tê te..

(14) 10. Program m e r e n langage C+ +. à partir du m om e nt où l'on doit utiliser une fonction e n de h ors du fich ie r où e lle e s t définie (ou, à partir de plusieurs fich ie rs source diffé re nts), on place s on prototype dans un fich ie r e n-tê te ;ce dernie r e s t incorporé , e n cas de besoin, par la dire ctive #include , ce q ui é vite tout ris q ue de faute d'écriture du prototype . 2) Com m e e n C, la "porté e " du prototype e s t lim ité e à : -. la partie du fich ie r source s itué e à la suite de sa déclaration, si elle figure à un nive au global, c'e s t-à -dire e n de h ors de toute définition de fonction7 ;c'é tait le cas du prototype de fe xple dans nos précédents e xe m ples ,. -. la fonction dans laq ue lle ilfigure , dans le cas contraire .. 3) D e m aniè re analogue à ce q ui s e produit pour l'e n-tê te d'une fonction, lors q u'un prototype ne pré cis e pas le type de la valeur de re tour, com m e dans : bizarre (int, float, char) ;. C+ + considérera qu'ils'agit, par dé faut, du type int. Ainsi, le prototype pré cédent e s t-ilé q uivalent à : int bizarre (int, float, char) ;. Nous vous cons e illons d'évite r ce tte possibilité q ui nuit à la lisibilité des program m e s . 4) Le prototype pe ut pre ndre une form e plus é toffé e 8, dans laq ue lle figure nt é galem e nt des nom s d'argum e nts. Ainsi, le prototype de notre fonction fe xple du début du paragraph e 2 pourrait é galem e nt s'é crire : double fexple (int a, double x) ;. ou e ncore : double fexple (int u, double v) ;. D ans ce cas, les nom s d'argum e nts (a e t x dans le pre m ie r e xe m ple, u e t v dans le s e cond) ne joue nt aucun rôle. Ils sont pure m e nt e t sim plem e nt ignorés du com pilate ur, de s orte q ue ce s prototype s re s te nt parfaite m e nt é q uivalents aux pré cédents. O n pe ut trouve r un inté rê t à ce tte possibilité lors q ue l'on souh aite accom pagne r ce prototype de com m e ntaires décrivant le rôle des diffé re nts argum e nts (ce la pe ut s'avé re r pratiq ue dans le cas où l'on place ce prototype dans un fich ie r e n-tê te ). 5) Ce rtains com pilate urs s e m blent ne pas im pos e r l'e m ploi de prototype s . En ré alité , ils fabriq ue nt autom atiq ue m e nt un prototype à la re ncontre du prem ie r appe ld'une fonction e n te nant com pte de ses argum e nts e ffe ctifs. Une te lle dém arch e q ui s e m ble partir d'un bon se ntim e nt (allége r la tâ ch e de l'utilisate ur) pe ut s e ré vé ler dé s astre us e . Actue llem e nt, toute fois, la te ndance e s t de n'effe ctue r ce "prototypage autom atiq ue " q ue s ur de m ande e xplicite de l'utilisate ur ou dans le cas de com pilation de program m e s é crits e n C (pour é vite r leur m odification systé m atiq ue ).. 7 - Y com pris l a fonction m ain. 8 - Nom m é e parfois prototype com pl e t ;l 'autre é tant nom m é e prototype réduit..

(15) II. Le s incom patibilité s d e C+ + ave c le C ANSI. 11. 3. ARGUM ENTS ET VA LEUR D E RETO UR D 'UNE FO NCTIO N 3.1 Points com m uns à C e t C+ + En C+ + , com m e e n C ANSI, les argum e nts d'une fonction ainsi que la valeur de re tour pe uve nt : • ne pas e xiste r, • ê tre une valeur "scalaire ", d'un de s types de bas e (caractè re s , e ntie rs, flottants, pointe urs), • ê tre une valeur d'un type s tructure . La derniè re possibilité a é té introduite par la norm e ANSI. Nous ve rrons q u'e n C+ + , e lle s e gé né ralise aux obje ts d'un type clas s e . Pour l'instant, notons sim plem e nt q u'ilsubsiste e n C+ + , com m e e n C ANSI, une disparité e ntre les tableaux e t les s tructure s puis q ue : • ile s t possible de transm e ttre la valeur d'une s tructure , aussi bien en argum e nt q u'e n valeur de re tour, • iln'e s t pas possible de faire de m ê m e ave c les tableaux. Note z q u'ils'agit là d'une disparité difficile à ré s orbe r, com pte te nu de la volonté de re ndre é q uivalents le nom d'un tableau e t son adre s s e . Bie n e nte ndu, ile s t toujours possible de transm e ttre l'adresse d'un tableau, m ais ce tte re m arq ue vaut é galem e nt pour une s tructure .. 3.2 D iffé re nce s e ntre C e t C+ + En fait, les diffé re nce s ne porte nt q ue s ur la syntaxe d e s e n-tê te s e t des prototypes des fonctions, e t ce ci uniq ue m e nt dans deux cas précis : • fonctions sans argum e nts, • fonctions sans valeur de re tour.. a)Fonctions s ans argum e nts Alors q u'e n C ANSI on pe ut e m ploye r le m ot void pour dé finir (e n-tê te ) ou dé clare r (prototype ) une fonction sans argum e nt, e n C+ + , on fournit une "liste vide". Ainsi, là où e n C, on dé clarait : float fct (void) ;. on dé clare ra, e n C+ + : float fct ( ) ;. b)Fonctions s ans val e ur de re tour En C ANSI, on peut utiliser le m ot void pour dé finir (e n-tê te ) ou dé clare r (prototype ) une fonction sans valeur de re tour. En C+ + , on doit absolum e nt le faire , com m e dans ce t e xe m ple : void fct (int, double) ;. La déclaration : fct (int, double) ;.

(16) 12. Program m e r e n langage C+ +. conduirait C+ + paragraph e 1).. à. considérer que fct fournit une valeur de re tour de type int (voir la re m arq ue du. 4. LE QUALIFICA TIF CO NST La norm e C ANSI a introduit le q ualificatif cons t. Ilpe rm e t de spécifie r q u'un sym bole corre s pond à "q ue lque ch os e " dont la valeur ne doit pas ch ange r, ce q ui pe ut pe rm e ttre au com pilate ur de s ignaler les te ntatives de m odification (lors q ue ce la lui e s t possible !). Ce ci re s te vrai e n C+ + . Ce pe ndant, un ce rtain nom bre de diffé re nce s im portante s apparais s e nt, au nive au de la portée du sym bole conce rné e t de son utilisation dans une expression.. 4.1 Porté e Lors q ue cons t s'appliq ue à des variables locales autom atiq ue s , aucune diffé re nce n'e xiste e ntre C e t C+ + , la porté e é tant lim ité e au bloc ou à la fonction conce rné e par la déclaration. En re vanch e , lors q ue cons t s'appliq ue à une variable globale, C+ + lim ite la portée du sym bole au fich ie r source conte nant la déclaration (com m e s 'ilavait re çu l'attribut s tatic) ;C ne faisait aucune lim itation. Pourq uoi ce tte diffé re nce ?La principale raison ré s ide dans l'idé e q u'ave c la rè gle adopté e par C+ + il devie nt plus facile de re m place r ce rtaine s instructions #de fine par des déclarations de constante s ;Ainsi, là où e n C vous procédiez de ce tte façon : #define N 8 ...... #define N 3 ...... fichier 1. fichier 2. vous pouve z, e n C+ + , procéder ainsi : const int N = 8 ; ..... fichier 1. const int N = 3 ; ..... fichier 2. En C, vous aurie z obte nu une e rre ur au m om e nt de l'édition de lie ns. Vous aurie z pu l'é vite r : • soit e n dé clarant N s tatic, dans au m oins un des deux fich ie rs (ou, m ie ux, dans les deux) : static const int N = 8 ;. static const int N = 3. ;. Ce ci aurait alors é té parfaite m e nt é q uivalent à ce q ue fait C+ + ave c les pre m iè res déclarations ; • soit, si N avait e u la m ê m e valeur dans les deux fich ie rs, e n plaçant, dans le s e cond fich ie r : extern const int N ;. m ais, dans ce cas, ilne s e s e rait plus agi d'un re m place m e nt de #de fine ..

(17) II. Le s incom patibilité s d e C+ + ave c le C ANSI. 13. 4.2 Util is ation dans une e xpre s s ion R appe lons q ue l'on nom m e "e xpre s s ion constante " une e xpre s s ion dont la valeur e s t calculée lors de la com pilation. Ainsi, ave c : const int p = 3 ;. l'e xpre s s ion : 2 * p * 5. n'est pas une expression constante en C al ors qu'el l e est une expression constante en C+ + . Ce point e s t particuliè re m e nt s e nsible dans les déclarations de tableaux (statiq ue s ou autom atiq ue s ) dont les dim e nsions doive nt obligatoire m e nt ê tre d e s e xpre s s ions constante s (m ê m e pour les tableaux autom atiq ue s , le com pilate ur doit connaî tre la taille à ré s e rve r sur la pile !). Ainsi, les instructions : const int nel = 15 ; ..... double t1 [nel + 1], t2[2 * nel] [nel] ;. s e ront acce pté e s e n C+ + , alors q u'e lles é taie nt re fus é e s e n C.. R e m arques : 1) En toute rigue ur, la possibilité q ue nous ve nons de décrire ne constitue pas une incom patibilité e ntre C e t C+ + puis q u'ils'agit d'une facilité s upplém e ntaire . 2) D 'une m aniè re gé né rale, C+ + a é té conçu pour lim ite r au m axim um l'e m ploi des directives du pré proce s s e ur (on de vrait pouvoir s e conte nte r de #include e t des directives d'inclusion conditionne lle). Le s m odifications apporté e s au q ualificatif cons t vont e ffe ctive m e nt dans ce s e ns 9 .. 5. CO M PA TIBILITÉ ENTRE LE TYPE VO ID * ET LES AUTRES PO INTEURS En C ANSI, le "type gé né riq ue " void *e s t com patible ave c les autre s type s pointe urs, e t ce ci dans les deux s e ns. Ainsi, ave c ces déclarations : void * gen ; int * adi ;. Ces deux affe ctations sont légales e n C ANSI : gen = adi ; adi = gen ;. Elles font inte rve nir de s "conve rsions im plicite s ", à savoir :. 9 - Encore faut-ilq ue l e program m e ur C+ + autre m e nt) !. acce pte de ch ange r l e s h abitudes qu'ilavait dû prendre en C (faute de pouvoir faire.

(18) 14. Program m e r e n langage C+ +. int *-> void * pour la pre m iè re , void *-> int * pour la s e conde . En C+ + , s e ule la conve rsion d'un pointe ur q ue lconq ue e n void * pe ut ê tre im plicite . Ainsi, ave c les déclarations précédente s , s e ule l'affe ctation gen = adi ;. e s t acce pté e . Bie n e nte ndu, ilre s te toujours possible de faire appe le xplicite m e nt à la conve rsion void *-> int *e n utilisant l'opé rate ur de "cast" : adi = (int *) gen ;. R e m arque : O n pe ut dire q ue la conve rsion d'un pointe ur de type q ue lconq ue e n void *re vie nt à ne s 'inté re s s e r q u'à l'adre s s e corre s pondant au pointe ur, e n ignorant son type . La conve rsion inve rs e , e n re vanch e , de void * e n un pointe ur de type donné, revie nt à associe r (pe ut-ê tre arbitraire m e nt !) un type à une adre s s e . M anife s te m e nt, ce tte deuxiè m e possibilité e s t plus dange re us e q ue la pre m iè re ;e lle pe ut m ê m e oblige r le com pilate ur à introduire des m odifications de l'adresse de départ, dans le s e ul but de re s pe cte r ce rtaine s contraintes d'aligne m e nt (lié e s au type d'arrivé e ). C'e s t la raison pour laq ue lle ce tte conve rsion ne fait plus partie des conve rsions im plicite s e n C+ + ..

(19) III. LES NO UVELLES PO SSIBILITÉS D 'ENTRÉES-SO RTIES CO NVERSA TIO NNELLES D E C+ +. C+ + dispose de toute s les routine s offe rte s par la "biblioth è q ue s tandard" du C ANSI. M ais ilcom porte é galem e nt de nouve lles possibilités d'entré e s -sortie s . Ce lles -ci re pos e nt sur les notions de "flots" e t de "surdéfinition d'opé rate ur" q ue nous n'aborde rons q u'ulté rie ure m e nt. Toute fois, ilne s e rait pas judicie ux d'atte ndre q ue vous ayez étudié ces diffé re nts points pour com m e nce r à é crire des program m e s com plets, rédigés dans l'e s prit de C+ + . C'e s t pourq uoi nous allons dans ce ch apitre vous présente r, de m aniè re as s e z inform e lle, ce s nouve lles possibilités d'entré e s -sortie s e n nous lim itant ce pe ndant à ce q ue nous nom m ons l'aspect "conve rsationne l" (lecture s ur "l'e ntré e s tandard", é criture s ur la "sortie s tandard").. 1. LES NO UVELLES ENTRÉES-SO RTIES EN C+ + Le s "routine s " (fonctions e t m acros) de la "biblioth è q ue s tandard" du C ANSI1, donc, e n particulie r, ce lles re lative s aux e ntré e s -sortie s , sont utilisables e n C+ + ;pour ce faire , ilvous suffit d'inclure les fich ie rs e ntê te h abitue ls, pour obte nir les prototype s e t autres déclarations néce s s aire s à leur bonne utilisation. M ais C+ + dispose en plus de possibilités d'entré e s -sortie s ayant les caracté ristiq ue s s uivante s : • sim plicité d'utilisation : e n particulie r, on pourra souve nt s'y affranch ir de la notion de "form at", si ch è re aux fonctions de la fam ille printf ou s canf, • dim inution de la taille du "m odule obje t2" corre s pondant : alors q ue , par e xe m ple, un s e ulappe lde printf introduit obligatoire m e nt, dans le m odule obje t, un e ns e m ble d'instructions e n couvrant toute s les é ve ntualité s , l'e m ploi de s nouve lles possibilité s offe rte s par C+ + n'am è ne ra q ue les s e ules instructions né ce s s aire s , • possibilité s e xte nsibles aux type s q ue vous définire z vous-m ê m e s ous form e de clas s e s . Voyons donc, dè s m ainte nant, com m e nt utiliser ces possibilités dans le cas de l'e ntré e s tandard ou de la sortie s tandard.. 1 - L'un des grands m é rites de ce tte norm e e s t de définir, outre l e l angage C l ui-m ê m e, l e s caracté ris tiq ues d'un certain nom bre de routine s form ant ce q ue l 'on nom m e l a "bibl ioth è q ue s tandard". 2 - Ensem bl e d'instructions, en l angage m ach ine, résul tant de l a traduction d'un fich ie r s ource..

(20) 16. Program m e r e n langage C+ +. 2. ÉCRITURE SUR LA SO RTIE STANDARD 2.1 Q u e l q ue s e xe m pl es Avant d'étudie r les diffé re nte s possibilité s offe rte s par C+ + , e xam inons q ue lque s e xe m ples .. a)Exe m pl e 1 Voye z ce pre m ie r cas, trè s sim ple, accom pagné de son e xe m ple d'exécution : _______________________________________________________________________________ ______ #include <iostream.h> /* indispensable pour utiliser cout */ /* suivant l'implémentation : on peut utiliser <iostream> */ /* ou <iostream.hpp> <iostream.hxx> ... */ main() { cout << "bonjour" ; } _______________________ bonjour _______________________________________________________________________________ ______ Ecriture e n C+ + (1). Note z, tout d'abord, q ue nous avons inclus un fich ie r e n-tê te nom m é iostre am .h ;son im plém e ntation pe ut varie r ave c les im plém e ntations de C+ + ;dans l'ave nir, on de vrait plutôt re ncontre r iostre am , sans e xte nsion. Ce fich ie r contie nt toute s les déclarations néce s s aire s à l'utilisation de s e ntré e s -sortie s s pé cifiq ue s au C+ + . L'inte rpré tation dé taillée d e l'instruction : cout << "bonjour" ;. né ce s s ite rait des connaissance s q ui ne s e ront introduite s q u'ulté rie ure m e nt. Pour l'instant, ilvous suffit d'adm e ttre les points suivants : • cout désigne un "flot de sortie " prédéfini, associé à l'e ntré e s tandard du C (s tdout), • < < e s t un "opé rate ur" dont l'opé rande de gauch e (ici cout) e s t un flot e t l'opé rande de droite une e xpre s s ion de type q ue lconq ue . L'instruction pré cédente pe ut ê tre inte rpré té e com m e ce ci : le flot cout re çoit la valeur "bonjour".. b)Exe m pl e 2 _______________________________________________________________________________ ______.

(21) III. Le s nouve lles possibilités d'entré e s -s ortie s conve rs ationne lles d e C+ +. 17. #include <iostream.h> main() { int n = 25 ; cout << "valeur : " ; cout << n ; } _______________________ valeur : 25 _______________________________________________________________________________ ______ Ecriture e n C+ + (2). Ilre s s e m ble au pré cédent, m ais, ce tte fois, vous constate z q ue nous avons utilisé le m ê m e opé rate ur < < pour e nvoye r sur le flot cout, d'abord une inform ation de type ch aî ne , e nsuite une inform ation de type e ntie r. Le rôle de l'opé rate ur < < e s t m anife s te m e nt diffé re nt dans les deux cas : dans le pre m ie r, on a transm is les caractè res de la ch aî ne , dans le s e cond, on a procédé à un "form atage 3" pour "conve rtir" une valeur binaire e ntiè re e n une s uite de caractè re s . Ce tte possibilité d'attribue r plusieurs significations à un m ê m e opé rate ur corre s pond à ce q ue l'on nom m e e n C+ + , la "surdéfinition d'opé rate ur" (q ue nous aborde rons e n dé taildans le ch apitre IX).. c)Exe m pl e 3 Jus q u'ici, nous avons é crit une instruction diffé re nte pour ch aq ue inform ation transm ise au flot cout. En fait, les deux instructions : cout << "valeur :" ; cout << n ;. pe uve nt s e conde ns e r e n une s e ule : cout << "valeur :" << n ;. Là e ncore , l'inte rpré tation e xacte de ce tte possibilité s e ra fournie ulté rie ure m e nt m ais, d'ore s e t déjà , nous pouvons dire qu'elle ré s ide dans deux points : • l'opé rate ur < < e s t (com m e l'opé rate ur "original") associatif de gauch e à droite , • le ré s ultat fourni par l'opé rate ur < < , q uand ilre çoit un flot e n pre m ie r opé rande e s t ce m ê m e flot, aprè s q u'ilait re çu l'inform ation conce rné e . Ainsi, l'instruction pré cédente e s t-e lle é q uivalente à : (cout << "valeur :") << n ;. Ce lle-ci pe ut s'inte rpré te r com m e ce ci : • dans un pre m ie r te m ps, le flot cout re çoit la ch aî ne "bonjour", • dans un deuxiè m e te m ps, le flot (cout < < "bonjour"), c'e s t-à -dire le flot cout augm e nté de "bonjour", re çoit la valeur de n.. 3 - Ici, ce form atage e s t im pl icite ;dans l e cas de printf, on l 'aurait e xpl icité (%d)..

(22) 18. Program m e r e n langage C+ +. Note z bie n q ue , si ce tte inte rpré tation ne vous paraî t pas é vidente , ilvous suffit d'adm e ttre pour l'instant q u'une instruction te lle q ue : cout << ----- << ----- << ----- << ----- ;. pe rm e t d'envoye r sur le flot cout les inform ations sym bolisées par de s traits, dans l'ordre où e lles apparais s e nt.. 2.2 Le s pos s ibil ité s d'é criture s ur cout Nous ve nons de voir de s e xe m ples d'écriture de ch aî ne s e t d'entie rs. D'une m aniè re gé né rale, vous pouve z utiliser l'opé rate ur < < pour e nvoye r sur cout la valeur d'une e xpre s s ion de l'un de s type s s uivants : • type de bas e q ue lconq ue (caractè re , e ntie r signé ou non, flottant), • ch aî ne de caractè re s (ch ar *)4 : on obtie nt l'affich age des caractè re s constituant la ch aî ne , • pointe ur, autre q ue ch ar *5 : on obtie nt l'adre s s e corre s pondante (e n h e xadé cim al) ;si on ve ut obte nir l'adresse d'une ch aî ne de caractè re s e t non les caractè re s q u'e lle contie nt, on pe ut toujours conve rtir ce tte ch aî ne (de type ch ar *) e n void *. Voici un e xe m ple de program m e illustrant ce s possibilités d'écriture s ur cout ;ile st accom pagné d'un e xe m ple d'exécution dans un environne m e nt C+ + Builder. _______________________________________________________________________________ ______ #include <iostream.h> main() { int n = 25 ; long p = 250000; unsigned q = 63000 ; char c = 'a' ; float x = 12.3456789 ; double y = 12.3456789e16 ; char * ch = "bonjour" ; int * ad = & n ; cout cout cout cout cout cout cout cout cout. << << << << << << << << <<. "valeur de n "valeur de p "caractère c "valeur de q "valeur de x "valeur de y "chaîne ch "adresse de n "adresse de ch. : : : : : : : : :. " << n << "\n" ; " << p << "\n" ; " << c << "\n" ; " << q << "\n" ; " << x << "\n" ; " << y << "\n" ; " << ch << "\n" ; " << ad << "\n" ; " << (void *) ch << "\n" ;. } _______________________ valeur de valeur de caractère valeur de valeur de. n p c q x. : : : : :. 25 250000 a 63000 12.345679. 4 - Le s ve rsions de C+ + anté rie ure s à l a 2.0 traitaie nt un caractè re com m e un e ntie r e t, par s uite, en affich aie nt l e code. 5 - Ce tte possibil ité n'e xis tait pas dans l e s ve rs ions de C+ + anté rie ure s à l a 2.0..

(23) III. Le s nouve lles possibilités d'entré e s -s ortie s conve rs ationne lles d e C+ + 19 valeur de y : 1.234567e+17 chaîne ch : bonjour adresse de n : 0x19c7fff4 adresse de ch : 0x19c700b4 _______________________________________________________________________________ ______ Le s possibilités d'écriture s u r cout. R e m arque : Note z q ue C+ + a décidé d'affich e r la ch aî ne s itué e à l'adre s s e indiq ué e par un pointe ur de type ch ar * e t non l'adre s s e e lle-m ê m e . Si te ln'avait pas é té le cas, le com porte m e nt d'une instruction aussi banale q ue : cout << "bonjour" ;. aurait é té bien déroutant.. 3. LECTURE SUR L'ENTRÉE STANDARD 3.1 Introduction D e m ê m e q u'ile xiste un flot de sortie prédéfini cout, associé à la sortie s tandard du C (s tdout), ile xiste un flot d'entré e prédéfini, nom m é cin, associé à l'e ntré e s tandard du C (s tdin). De m ê m e q ue l'opé rate ur < < pe rm e t d'envoye r de s inform ations sur un flot de sortie (donc, e n particulie r, sur cout), l'opé rate ur > > pe rm e t de re ce voir6 de l'inform ation e n prove nance d'un flot d'entré e (donc, e n particulie r, de cin). Par e xe m ple, l'instruction (n é tant de type int) : cin >> n ;. dem ande ra de lire "des caractè re s " sur le flot cin e t de les "conve rtir" e n une valeur de type int. D 'une m aniè re gé né rale : cin >> n >> p ;. s e ra é q uivalent à : (cin >> n) >> p ;. Pour donne r une inte rpré tation im agé e (e t pe u form e lle) analogue à ce lle fournie pour cout, nous pouvons dire q ue la valeur de n e s t d'abord e xtraite du flot cin ;e nsuite , la valeur de p e s t e xtraite du flot cin > > n (com m e pour < < , le ré s ultat de l'opé rate ur > > e s t un flot), c'e s t-à -dire de ce q u'e s t deve nu le flot cin, aprè s q u'on e n a e xtrait la valeur de n.. 6 - O n dit aussi extraire..

(24) 20. Program m e r e n langage C+ +. 3.2 Le s pos s ibil ité s de l e cture s ur cin D 'une m aniè re gé né rale, dans toute s les ve rsions de C+ + , vous pouve z utiliser l'opé rate ur > > pour accéder à des inform ations de type de bas e q ue lconq ue (signé ou non pour les type s e ntie rs) ou à des ch aî ne s de caractè re s 7 (ch ar *). Par ailleurs, une bonne part des conve ntions d'analyse des caractè re s lus sont les m ê m e s q ue ce lles e m ployé e s par s canf. Ainsi : • les diffé re nte s inform ations sont s é paré e s par un ou plusieurs caractè re s parm i ce ux-ci8 : e s pace , tabulation h orizontale (\t) ou ve rticale (\v), fin de ligne (\n), re tour ch ariot (\r) ou ch ange m e nt de page (\f)9 . • un caractè re "invalide" pour l'usage q u'on doit e n faire (un point pour un e ntie r, une lettre pour un nom bre ...) arrê te l'e xploration du flot, com m e s i l'on avait re ncontré un s é parate ur ;m ais ce caractè re invalide sera à nouve au pris e n com pte lors d'une proch aine lecture . En re vanch e , contraire m e nt à ce q ui s e produisait pour s canf, la lecture d'un caractè re s ur cin com m e nce par "saute r les s é parate urs" ;aussi n'est-il pas possible de lire directe m e nt ce s caractè re s . Nous ve rrons com m e nt y parve nir dans le ch apitre consacré aux flots.. 3.3 Exe m pl es Nous vous proposons diffé re nts program m e s , accom pagnés d'exem ples d'exécution (ré alisés ave c le clavie r e t l'é cran com m e e ntré e s -sortie s s tandard) illustrant les possibilités de lecture s ur cin. _______________________________________________________________________________ ______ #include <iostream.h> main() { int n ; float x ; char t[81] ; do { cout << "donnez un entier, une chaîne et un flottant : " ; cin >> n >> t >> x ; cout << "merci pour " << n << ", " << t << " et " << x << "\n" ; } while (n) ; } _______________________ donnez un entier, une chaîne et un flottant : 15 bonjour 8.25 merci pour 15, bonjour et 8.25 donnez un entier, une chaîne et un flottant : 15 bonjour 8.25 7. Iln'e s t pas pré vu de l ire l a val e ur d'un pointe ur ;e n pratiq ue, cel a n'aurait guè re d'inté rê t e t, de pl us, com porte rait de grand risques. 8 - On l e s appe l l e parfois des "e s paces-bl ancs " (de l 'angl ais, "w h ite s pace s "). 9 - En pratiq ue, on expl oite e s s e ntie l l e m e nt l 'espace et l a fin de l igne (dans l e s e nvironne m e nts D O S, toute fois, l e re tour ch ariot pe ut apparaî tre e n pl us de l a fin de l igne, m ais on ne s'en aperçoit q ue l ors q u'on l it des caractè re s )..

(25) III. Le s nouve lles possibilités d'entré e s -s ortie s conve rs ationne lles d e C+ + 21 merci pour 15, bonjour et 8.25 donnez un entier, une chaîne et un flottant : 0 bye 0 merci pour 0, bye et 0 _______________________________________________________________________________ ______ Usage classique des séparate urs. _______________________________________________________________________________ ______ #include <iostream.h> main() { char tc[81] ; int i = 0 ;. // pour conserver les caractères lus sur cin // position courante dans le tableau c. cout << "donnez une suite de caractères terminée par un point \n" ; do cin >> tc[i] ; // attention, pas de test de débordement dans tc while (tc[i++] != '.') ; cout << "\n\nVoici les caractères effectivement lus : \n" ; i=0 ; do cout << tc[i] ; while (tc[i++] != '.') ; } _______________________ donnez une suite de caractères terminée par un point Voyez comme C++ pose quelques problèmes lors de la lecture d'une "suite de caractères" . Voici les caractères effectivement lus : VoyezcommeC++posequelquesproblèmeslorsdelalectured'une"suitedecaractères". _______________________________________________________________________________ ______ Quand on ch e rch e à lire une suite de caractè re s. _______________________________________________________________________________ ______ #include <iostream.h> main() { int n ; do.

(26) 22. }. Program m e r e n langage C+ + { cout << "donnez un nombre entier : " ; cin >> n ; cout << "voici son carré : " << n*n << "\n" ; } while (n) ; _______________________. donnez un nombre entier : 3 voici son carré : 9 donnez un nombre entier : à voici son carré : 9 donnez un nombre entier : voici son carré : 9 donnez un nombre entier : voici son carré : 9 ^C _______________________________________________________________________________ ______ Boucle infinie s u r un caractè re invalide. _______________________________________________________________________________ ______ #include <iostream.h> main() { int n, p ; cout << "donnez une valeur pour n : " ; cin >> n ; cout << "merci pour " << n << "\n" ; cout << "donnez une valeur pour p : " ; cin >> p ; cout << "merci pour " << p << "\n" ; } _______________________ donnez une valeur pour n : 12 25 merci pour 12 donnez une valeur pour p : merci pour 25 _______________________________________________________________________________ ______ Quand le clavie r e t l'écran se m blent m alsynch ronis é s.

(27) IV. LES SPÉCIFICITÉS D U C+ +. Com m e nous l'avons dit dans le pre m ie r ch apitre , C+ + dispose d'un certain nom bre de spé cificité s q ui ne sont pas vé ritablem e nt axé e s s ur la P.O .O . Ils'agit e s s e ntie llem e nt des suivante s : • nouve lle form e de com m e ntaire (e n fin de ligne ), • e m place m e nt libre des déclarations, • notion de ré fé re nce , • argum e nts par dé faut dans les déclarations des fonctions, • surdéfinition de fonctions, • opé rate urs ne w e t de lete , • fonctions "e n ligne " (inline ). D 'une m aniè re gé né rale, ce s possibilité s s e ront, pour la plupart, souve nt utilisées conjointe m e nt ave c ce lles de P.O .O . C'e s t ce q ui justifie q ue nous vous les e xposions dè s m ainte nant. Note z q ue le C+ + introduit é galem e nt de nouve aux opé rate urs de cas t ;m ais com m e ce rtains aspects inte rfè re nt ave c la notion d'obje t e t d'identification dynam iq ue de type lors de l'e xé cution, ils fe ront l'obje t d'une pré s e ntation s é parée dans l'anne xe C.. 1. LE CO M M ENTA IRE D E FIN D E LIGNE En C ANSI, un com m e ntaire pe ut ê tre introduit e n n'im porte q ue le ndroit où un e s pace e s t autoris é 1 e n le faisant pré céder de /*e t suivre de */. Ilpe ut alors é ve ntue llem e nt s'é te ndre s ur plusieurs ligne s . En C+ + , vous pouve z, en outre, utiliser des "com m e ntaires de fin de ligne " e n introduisant les deux caractè re s : //. Dans ce cas, tout ce q ui e s t situé e ntre // e t la fin de la ligne e s t un com m e ntaire . Note z q ue ce tte nouve lle possibilité n'apporte q u'un surcroî t de confort e t de sécurité ;e n e ffe t, une ligne te lle q ue : cout << "bonjour\n" ; // formule de politesse. pe ut toujours ê tre é crite ainsi : 1 - D onc, e n pratiq ue, n'im porte où, pourvu q u'on ne "coupe pas e n deux" un identificate ur q ue l conq ue ou une ch aî ne cons tante..

(28) 24. Program m e r e n langage C+ + cout << "bonjour\n" ; /*formule de politesse*/. Vous pouve z m ê ler (volontaire m e nt ou non !) les deux form ules . Dans ce cas, note z q ue , dans : /* partie // partie */ partie 1 2 3. le com m e ntaire "ouve rt" par /* ne s e te rm ine q u'au proch ain */ ;donc partie 1 e t partie 2 sont des com m e ntaire s , tandis q ue partie 3 e s t considérée com m e apparte nant aux instructions. D e m ê m e , dans : partie // partie /* partie */ partie 1 2 3 4. le com m e ntaire introduit par // s'é te nd jus q u'à la fin de la ligne . Il"couvre " donc partie 2, partie 3 e t partie 4. R e m arques : 1) Le com m e ntaire de fin de ligne constitue le s e ulcas où la fin de ligne joue un rôle s ignificatif autre q ue ce lui d'un sim ple s é parate ur. 2) Si l'on utilise systé m atiq ue m e nt le com m e ntaire de fin de ligne , on pe ut alors faire appe là /*e t * pour inh iber un ensem ble d'instructions (conte nant é ve ntue llem e nt des com m e ntaire s ) e n ph ase de m ise au point.. 2. D ÉCLARATIO NS ET INITIA LISATIO NS 2.1 Rè gl e s gé né ral es C+ + s'avè re plus souple q ue le C ANSI e n m atiè re de déclarations. Plus précisém e nt, e n C+ + , iln'e s t plus obligatoire de re groupe r au début les déclarations e ffe ctué e s au s e in d'une fonction ou au s e in d'un bloc. Ce lles -ci pe uve nt ê tre e ffe ctué e s où bon vous s e m ble, pour pe u q u'e lles apparais s e nt avant q ue l'on e n ait besoin : leur porté e re s te lim ité e à la partie du bloc ou de la fonction suivant leur dé claration. Par ailleurs, les e xpre s s ions utilisées pour initialiser une variable s calaire pe uve nt ê tre q ue lconq ue s , alors q u'e n C e lles ne pe uve nt faire inte rve nir q ue des variables dont la valeur e s t connue dè s l'e ntrée dans la fonction conce rné e . Voici un e xe m ple incorre ct e n C ANSI e t acce pté e n C+ + : main() { int n ; ..... n = ... ..... int q = 2*n - 1 ; ..... }.

Références

Documents relatifs

The JlL(ksoll ~C~iIOJ~etbodOIOIO' J1fol is 3Ppropri~U on ly to tbe c133sof.problems whicb arc stro ngly Mid inhereMly'v queflt i3l, such M data proo:euinl.. witb repri~~~tinl

Si l’on s’intéresse au diplôme (DIPL) on constate que la détention d’un diplôme du secondaire inférieur (SEC INF) entraîne une diminution du taux d’emploi de près de

La didactique des mathématiques se place ainsi dans le cadre des sciences cognitives comme la science des conditions spécifiques de la diffusion des

11. Le Roman de Tristan en prose, sous la dir. Le récit de la mort de Tristan se trouve au t.. inscrits de façon homogène. On remarque toutefois que Marc, qui lève le bras pour

Jusque-là les enseignements d'ethnologie sont dispersés entre la Chaire d'anthropologie du Muséum d'Histoire naturelle, la Chaire d'histoire des religions de l'Ecole Pratique

7KH ,QIUDUHG FDPHUD HQDEOHV WKH WHPSHUDWXUH ILHOG RQ WKH VXUIDFH RI WKH VDPSOH WR

Jean Vaquer (sous la direction de), rapport de fouilles : le site du Mourral-Millegrand, Centre d'Anthropologie de Toulouse (EHSS, CNRS), 1999-2000

Mathonet dans un contexte de croissance d’une piraterie de plus en plus virulente (cf.. possibilité sera renouvelée en 2009 25. En 2010, le Conseil de sécurité de l’ONU adopte