Top Banner

of 136

ANSI C++ összefoglaló

Oct 10, 2015

Download

Documents

AnitaRénes
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
  • ANSI

    C++sszefoglal

  • 2Az elektronikus formtum fejezet ksztse sorn a Szerzk s a Kiad alegnagyobb gondossggal jrtak el. Ennek ellenre hibk elfordulsa nemkizrhat.Az ismeretanyag felhasznlsnak kvetkezmnyeirt sem a Kiad, sem aSzerzk felelssget nem vllalnak.

    Minden jog fenntartva. Jelen fejezetet, vagy annak rszleteit a Kiadengedlye nlkl brmilyen formban felhasznlni, kzlni tilos.

    Tth Bertalan, 2001

    ISBN: 963 618 265 5

    Kiad. ComputerBooks Kiad Kft1126 Budapest Tartsay Vilmos u. 12

    Telefon/fax. 3753-591, 3751-564E-mail: [email protected]:www.computerbooks.hu

  • 3Tartalomjegyzk

    TARTALOMJEGYZK ..................................................................................................................................................3

    F1. ANSI C++ SSZEFOGLAL...................................................................................................................................6

    1. A C++ MINT EGY JOBB C NYELV..........................................................................................................................7

    1.1. ELS TALLKOZS C++ NYELVEN RT PROGRAMMAL...............................................................................................71.2. A C++ NYELV ALAPELEMEI ......................................................................................................................................9

    1.2.1. A nyelv jelkszlete .............................................................................................................................................91.2.2. A C++ nyelv azonosti ....................................................................................................................................91.2.3. Konstansok......................................................................................................................................................101.2.3.1. Egsz konstansok........................................................................................................................................................ 101.2.3.2. Karakterkonstansok .................................................................................................................................................... 111.2.3.3. Lebegpontos konstansok........................................................................................................................................... 11

    1.2.4. Sztringkonstansok (literlok)...........................................................................................................................121.2.5. Megjegyzsek ..................................................................................................................................................121.2.6. Opertorok s rsjelek ...................................................................................................................................12

    1.3. A C++ PROGRAM SZERKEZETE ...............................................................................................................................141.3.1. Egyetlen modulbl felpl C++ program.....................................................................................................141.3.2. Tbb modulbl ll C++ program .................................................................................................................15

    1.4. ALAPTPUSOK, VLTOZK, KONSTANSOK ...............................................................................................................161.4.1.A C++ nyelv tpusai.........................................................................................................................................161.4.1.1. Tpuselrsok, tpusmdostk .................................................................................................................................. 171.4.1.2. Tpusminstk ........................................................................................................................................................... 171.4.1.3. A felsorolt tpus (enum).............................................................................................................................................. 18

    1.4.2. Egyszer vltozk definilsa .........................................................................................................................181.4.3.. Sajt tpusok ellltsa .................................................................................................................................191.4.5. Konstansok a C++ nyelvben...........................................................................................................................191.4.6 rtkek, cmek, mutatk s referencik ............................................................................................................201.4.6.1. Balrtk s jobbrtk .................................................................................................................................................. 201.4.6.2. Ismerkeds a mutatval s a referencival .................................................................................................................. 211.4.6.3.A void * tpus ltalnos mutatk................................................................................................................................ 221.4.6.4. Tbbszrs indirektsg mutatk ............................................................................................................................... 22

    1.5. OPERTOROK S KIFEJEZSEK ................................................................................................................................231.5.1.Precedencia s asszociativits .........................................................................................................................251.5.1.1.Az elsbbsgi (precedencia) szably ........................................................................................................................... 251.5.1.2. A csoportostsi (asszociativits) szably ................................................................................................................... 25

    1.5.2. Mellkhatsok s a rvidzr kirtkels..........................................................................................................261.5.3. Elsdleges opertorok.....................................................................................................................................261.5.4. Aritmetikai opertorok ....................................................................................................................................261.5.5. sszehasonlt s logikai opertorok .............................................................................................................271.5.6. Lptet opertorok..........................................................................................................................................271.5.7. Bitmveletek ....................................................................................................................................................281.5.7.1. Bitenknti logikai mveletek ...................................................................................................................................... 281.5.7.2. Biteltol mveletek..................................................................................................................................................... 28

    1.5.8. rtkad opertorok .......................................................................................................................................291.5.9. Pointermveletek.............................................................................................................................................301.5.10. A sizeof opertor ...........................................................................................................................................301.5.11. A vessz opertor ..........................................................................................................................................311.5.12. A feltteles opertor ......................................................................................................................................311.5.13. Az rvnyessgi kr (hatkr) opertor ........................................................................................................321.5.14. A new s a delete opertorok hasznlata ......................................................................................................321.5.15. Futsidej tpusazonosts ............................................................................................................................341.5.16. Tpuskonverzik ............................................................................................................................................341.5.16.1. Explicit tpustalaktsok.......................................................................................................................................... 341.5.16.2. Implicit tpuskonverzik........................................................................................................................................... 35

    1.5.17. Bvebben a konstansokrl ............................................................................................................................36

  • 41.6. A C++ NYELV UTASTSAI......................................................................................................................................381.6.1. Utastsok s blokkok......................................................................................................................................381.6.2. Az if utasts ....................................................................................................................................................391.6.2.1. Az if-else szerkezet ..................................................................................................................................................... 401.6.2.2. Az else-if szerkezet ..................................................................................................................................................... 41

    1.6.3. A switch utasts..............................................................................................................................................421.6.4. A ciklusutastsok............................................................................................................................................431.6.4.1. A while ciklus ............................................................................................................................................................. 441.6.4.2. A for ciklus ................................................................................................................................................................. 441.6.4.3. A do-while ciklus........................................................................................................................................................ 46

    1.6.5. A break s a continue utastsok.....................................................................................................................471.6.5.1. A break utasts........................................................................................................................................................... 471.6.5.2. A continue utasts...................................................................................................................................................... 48

    1.6.6. A goto utasts.................................................................................................................................................491.6.7. A return utasts..............................................................................................................................................491.6.8. Kivtelek kezelse...........................................................................................................................................491.6.9. Defincik bevitele az utastsokba .................................................................................................................52

    1.7. SZRMAZTATOTT ADATTPUSOK .............................................................................................................................531.7.1. Tmbk, sztringek s mutatk .........................................................................................................................531.7.1.1. Egydimenzis tmbk ................................................................................................................................................ 531.7.1.2. Mutatk s a tmbk .................................................................................................................................................. 541.7.1.3. Sztringek..................................................................................................................................................................... 551.7.1.4. Tbbdimenzis tmbk .............................................................................................................................................. 571.7.1.5. Mutattmbk, sztringtmbk.................................................................................................................................... 581.7.1.6. Dinamikus helyfoglals tmbk ............................................................................................................................... 59

    1.7.2. Felhasznl ltal definilt adattpusok...........................................................................................................621.7.2.1. A struct struktratpus................................................................................................................................................. 621.7.2.2. A class osztlytpus..................................................................................................................................................... 671.7.2.3. A union tpus adatstruktrk..................................................................................................................................... 681.7.2.4. A bitmezk hasznlata ................................................................................................................................................ 69

    1.8. FGGVNYEK .........................................................................................................................................................721.8.1. Fggvnyek defincija s deklarcija..........................................................................................................721.8.2. A fggvnyek paramterezse s a fggvnyrtk...........................................................................................741.8.3. A fggvnyhvs ..............................................................................................................................................751.8.4. Klnbz tpus paramterek hasznlata .....................................................................................................761.8.4.1. Aritmetikai tpus paramterek................................................................................................................................... 771.8.4.2. Felhasznli tpus paramterek................................................................................................................................. 771.8.4.3. Tmbk tadsa fggvnynek..................................................................................................................................... 781.8.4.4.Sztringargumentumok.................................................................................................................................................. 801.8.4.5. A fggvny mint argumentum .................................................................................................................................... 821.8.4.6. Vltoz hosszsg argumentumlista......................................................................................................................... 841.8.4.7. A main() fggvny paramterei s visszatrsi rtke ................................................................................................ 85

    1.8.5. Rekurzv fggvnyek hasznlata .....................................................................................................................851.8.6. Alaprtelmezs szerinti (default) argumentumok ............................................................................................861.8.7.Inline fggvnyek .............................................................................................................................................871.8.8. Fggvnynevek tdefinilsa (overloading) ...................................................................................................881.8.9. ltalnostott fggvnyek (template)...............................................................................................................891.8.10. Tpusmegrz szerkeszts (type-safe linking)................................................................................................90

    1.9. TROLSI OSZTLYOK............................................................................................................................................921.9.1. Az azonostk lettartama ...............................................................................................................................921.9.2 rvnyessgi tartomny s a lthatsg ..........................................................................................................931.9.3. A kapcsolds .................................................................................................................................................931.9.4. Nvterletek ....................................................................................................................................................931.9.5. A trolsi osztlyok hasznlata.......................................................................................................................96

    1.10. AZ ELFELDOLGOZ (PREPROCESSZOR)..............................................................................................................1001.10.1. llomnyok beptse a forrsprogramba ..................................................................................................1001.10.2. Feltteles fordts........................................................................................................................................1011.10.3. Makrk hasznlata......................................................................................................................................1031.10.4. A #line, az #error s a #pragma direktvk.................................................................................................106

  • 52. A C++ MINT OBJEKTUM-ORIENTLT NYELV..............................................................................................107

    2.1. OSZTLYOK DEFINILSA.....................................................................................................................................1102.1.1. Adattagok ......................................................................................................................................................1102.1.2. Tagfggvnyek ..............................................................................................................................................110

    2.1.2.1. Konstans tagfggvnyek s a mutable tpusminst................................................................................................ 1112.1.3. Az osztly tagjainak elrse ..........................................................................................................................1122.1.4. Az osztlyok friend mechanizmusa................................................................................................................1132.1.5. Az osztly objektumai....................................................................................................................................1132.1.6. Statikus osztlytagok hasznlata...................................................................................................................1142.1.7. Osztlytagra mutat pointerek......................................................................................................................115

    2.2. KONSTRUKTOROK S DESTRUKTOROK ..................................................................................................................1172.2.1. Konstruktorok................................................................................................................................................117

    2.2.1.1. A konstruktorok explicit paramterezse.................................................................................................................. 1182.2.2. Destruktorok..................................................................................................................................................1192.2.3. Az objektum tagosztlyainak inicializlsa...................................................................................................119

    2.3. OPERTOROK TDEFINILSA (OPERATOR OVERLOADING) ..................................................................................1212.3.1. A new s a delete opertorok tdefinilsa ..................................................................................................1222.3.2. Felhasznl ltal definilt tpuskonverzi ....................................................................................................1232.3.3. Az osztlyok bvtse input/output mveletekkel...........................................................................................123

    2.4. AZ RKLS (RKLDS) MECHANIZMUSA ........................................................................................................1252.4.1. A szrmaztatott osztlyok..............................................................................................................................1252.4.2. Az alaposztly inicializlsa .........................................................................................................................1262.4.3. Virtulis tagfggvnyek.................................................................................................................................1262.4.4. Virtulis alaposztlyok..................................................................................................................................128

    2.5. LTALNOSTOTT OSZTLYOK (TEMPLATES) ........................................................................................................1302.5.1. A typename kulcssz......................................................................................................................................132

    2.6. FUTS KZBENI TPUSINFORMCIK (RTTI) OSZTLYOK ESETN ........................................................................1333. A SZABVNYOS C++ NYELV KNYVTRAINAK TTEKINTSE..................................................................................135

  • 6F1. ANSI C++ sszefoglal

    A C++ nyelv kidolgozsa az AT&T Bell Laboratriumoknl dolgoz Bjarne Stroustrop nevhez fzdik.Mint ahogy ismeretes a C nyelvet szintn itt fejlesztettk ki a 70-es vek elejn. gy nem kell csodlkozniazon, hogy a tz vvel ksbbi C++ fejleszts a C nyelvre plt. A C nyelv ismerete ezrt teljesentermszetes kiindulpont a C++ nyelv megismershez. Bjarne Stroustrop kt f szempontot tartott szemeltt a C++ kidolgozsnl:

    1. A C++ nyelv legyen fellrl kompatibilis az eredeti C nyelvvel.2. A C++ nyelv bvtse ki a C nyelvet a Simula 67 nyelvben hasznlt osztlyszerkezettel (class).

    Az osztlyszerkezet, amely a C nyelv struct adatszerkezetre plt, lehetv tette az objektum-orientltprogramozs (OOP) megvalstst.

    A C++ nyelv tbb szakaszban nyerte el mai formjt. A C++ Version 1.2 vltozata terjedt el elszr avilgon (1985). A hasznlata sorn felvetdtt problmk s ignyek figyelembevtelvel Bjarne Stroustropkidolgozta a Version 2.0 nyelvdefincit (1988). A jelents vltoztatsok miatt a rgi C++ (1.2) nyelven rtprogramok ltalban csak kisebb-nagyobb javtsok utn fordthatk le a 2.0-s verzit megvalstfordtprogrammal. Az vek folyamn a C++ nyelv jabb defincii (3.x) jelentek meg, azonban a lnyegesjdonsgok kt nagy csoportba sorolhatk:

    kivtelek (exception) kezelse, paramterezett tpusok, osztlyok s fggvnyek hasznlata (templates, sablonok).

    A C nyelvet tbb lpsben szabvnyostottk. Az els (ANSI) szabvny 1983-ban jelent meg, gy alapulszolglhatott a C++ nyelv megformlshoz. A C szabvnyt 1989-ben revzi al vettk (IOS/IEC), majd1995-ben kibvtettk a szles karakterek (wchar_t) hasznlatnak lehetsgvel. A C++ szabvnykidolgozsban a ANSI X3J16 s az ISO WG21 bizottsgok vettek rszt a 90-es vek els felben. Munk-juk eredmnyeknt 1997 novemberben megszletett az ANSI/ISO C++ szabvny, melyre a napjainkbanhasznlt legtbb C++ fordtprogram pl.

    Mieltt elkezdennk a szabvnyos C++ nyelv elemeinek bemutatst, le kell szgeznnk, hogy a C++ nyelva C nyelv szintakszisra pl nll programozsi nyelv. Alapvet eltrs a kt nyelv kztt, hogy amg aC nem tpusos nyelv, addig a C++ ersen tpusos objektum-orientlt nyelv.

    A nyelv bemutatst kt lpsben vgezzk. Elszr ttekintjk azokat az eszkzket, amelyek a C nyelvtermszetes kiegsztst jelentik. A lehetsgek felhasznlsval hatkonyan kszthetnk nem objektum-orientlt programokat. A msodik rszben az objektum-orientlt programozst tmogat C++ nyelvvelismerkednk meg.

    A Borland C++ Builder rendszer szintn lehetsget knl a fenti rszek sztvlasztsra. A .C kiterjesztsfjlok esetn csak bizonyos C-kiegsztsek hasznlatt engedlyezi a fordt, mg a msodik opci vlaszt-sakor a teljes C++ nyelvdefinci hasznlhat. A .CPP kiterjeszts fjlok esetn mindkt esetben C++programknt fordt a fordtprogram.

  • 71. A C++ mint egy jobb C nyelv

    A C++ nyelv a hagyomnyos (funkci-orientlt) s az objektum-orientlt programptst egyarnt tmogatja.Elsknt azokat a nyelvi elemeket fogjuk csokorba, amelyek mindkt mdszerrel felhasznlhatkhatkonyan mkd programok kialaktshoz. Az F1.2. fejezetben az osztlyok ltal megvalstott objek-tum-orientlt programptsre helyezzk a hangslyt.

    1.1. Els tallkozs C++ nyelven rt programmalTekintsk az albbi egyszer C nyelven megrt programot, amely bekr egy szveget s kt szmot, majdkirja a szveget s a szmok szorzatt.

    #include void main(){ char nev[20]; int a; double b;

    printf("Krem a szveget: "); scanf("%s",nev); printf("A="); scanf("%d",&a); printf("B="); scanf("%lf",&b); printf("%s : A*B=%lf\n",nev,a*b);}

    A pldban a I/O mveletek elvgzshez a szabvnyos C-knyvtrban tallhat scanf() s printf()fggvnyeket hasznltuk. Ezen fggvnyek nem tekinthetk a C nyelv rsznek, hiszen csak knyvtrifggvnyek. A C++ nyelv a szabvnyos I/O mveletek kezelsre szintn tartalmaz kiegsztst, a cin s acout adatfolyam (stream) objektumok definilsval, amelyek szintn nem kpezik rszt a C++ nyelvdefincijnak. Ezen osztlyok felhasznlsval a fenti program szabvnyos C++ nyelven elksztett vltoza-ta:

    #include using namespace std;

    void main(){ char nev[20]; int a; double b;

    cout > nev; cout > a; cout > b; cout

  • 8A szabvnyos input elvgzsre a cin, mg a szabvnyos outputknt a cout adatfolyam-objektumot hasznl-juk. Ltezik mg egy szabvnyos hiba stream is, a cerr. Mindhrom objektum defincijt a IOSTREAMdeklarcis llomny tartalmazza. (A 16-bites karaktereket tartalmaz szvegek kezelst a fentiobjektumok w betvel kezdd prjaik tmogatjk: wcout, wcin, wcerr.)Az adatfolyam-osztlyok lehets-geit a ksbbiekben rszletesen trgyaljuk. Az itt bemutatott szabvnyos I/O mveleteket a pldaprog-ramokban kvnjuk felhasznlni.

  • 91.2. A C++ nyelv alapelemei

    A C++ nyelvvel val ismerkeds legelejn ttekintjk a C++ programozsi nyelv azon alapelemeit - aneveket, a szmokat s a karaktereket - amelyekbl a C++ program felpl. Az ANSI C++ szabvnynyelvhasznlatval lve, ezeket az elemeket tokennek nevezzk. A C++ forrsprogram fordtsakor afordtprogram a nyelv tokenjeit dolgozza fel. (A tokeneket a fordt mr nem bontja tovbbi rszekre.). AC++ nyelv alapelemeihez tartoznak a kulcsszavak, az azonostk, a konstansok, a sztringliterlok, azopertorok s az rsjelek.

    1.2.1. A nyelv jelkszlete

    A szabvnyos C++ program ksztsekor ktfle jelkszlettel dolgozunk. Az els jelkszlet azokat akaraktereket tartalmazza, amelyekkel a C++ programot megrjuk:

    A B C D E F G H I JK L M N O P Q R S TU V W X Y Z

    a b c d e f g h i jk l m n o p q r s tu v w z y z

    ! " # % & ' ( ) * +, - / : ; < = > ? [\ ] ^ _ { | } ~

    A nem lthat karakterek kzl ide tartoznak mg a szkz, a vzszintes s fggleges tabultor, a soremelss a lapdobs karakterek is, melyek feladata a forrsszveg tagolsa. (Ezeket a karaktereket sszefoglalnven white-space karaktereknek hvjuk.) Azok a karakterek (ANSI, UniCode) melyeket nem tartalmaz aC++ nyelv karakterkszlete szintn szerepelhetnek a programban, de csak megjegyzsek s sztringliterlok(szvegkonstansok) belsejben.

    1.2.2. A C++ nyelv azonosti

    A C++ nyelv program bizonyos sszetevire (pl. vltozkra, fggvnyekre, cmkkre,...) nvvelhivatkozunk. A nevek (azonostk, szimblumok) megfelel megvlasztsa lnyeges rsze a programrsnak. Az azonostk hossza ltalban implementcifgg - a legtbb fordt legfeljebb 32 karakteresnevek hasznlatt tmogatja. Az azonost els karaktere bet vagy _(alhzsjel) lehet, mg a msodikkaraktertl kezdden betk, szmok s alhzsjelek vlthatjk egymst. Az azonostk elejn azalhzsjel ltalban a rendszer ltal hasznlt, illetve a C++ nyelv bvtst jelent nevekben szerepel. Alegtbb programozsi nyelvtl eltren a C++ nyelv az azonostkban megklnbzteti a kis- s anagybetket. Ezrt az albbi nevek egymstl fggetlenl hasznlhatk a programban (nem azonosak):

    alma, Alma, ALMA

    Elterjedt konvenci, hogy kisbetvel rjuk a C++ azonostkat s csupa nagybetvel az elfordt ltalhasznlt neveket (makrkat).

    byte, TRUE, FALSE

    Az rtelmes szavakbl sszelltott azonostkban az egyes szavakat ltalban nagybetvel kezdjk:FelsoSarok, XKoordinata

    Bizonyos azonostk specilis jelentst hordoznak. Ezeket a neveket foglalt szavaknak vagy kulcsszavaknaknevezzk. A foglalt szavakat a programban csak a hozzjuk rendelt rtelmezsnek megfelelen lehethasznlni. A kulcsszavakat nem lehet tdefinilni, j jelentssel elltni. Az albbi tblzatban sszefoglaltukaz ANSI C++ nyelv kulcsszavait:

  • 10

    asm do inline return tryauto double int short typedefbool dynamic_cast long signed typeidbreak else mutable sizeof typenamecase enum namespace static unioncatch explicit new static_cast unsignedchar extern operator struct usingclass false private switch virtualconst float protected template voidconst_cast for public this volatilecontinue friend register throw wchar_tdefault goto reinterpret_cast true whiledelete if

    A legtbb fordtprogram kibvti a szabvnyos kulcsszavakat sajt jelentssel br szavakkal. Erre a C++szabvny a kt alhzsjel hasznlatt javasolja, pldul:

    __try, __property, __published

    1.2.3. Konstansok

    A C++ nyelv megklnbzteti a numerikus s a szveges konstansrtkeket. A konstansok alatt mindigvalamifle szmot rtnk, mg a szveges konstansokat sztringliterlnak hvjuk. A konstans rtkek ilyenmegklnbztetst a trolsi s felhasznlsi mdjuk indokolja.

    A C++ nyelvben karakteres, logikai, egsz, felsorolt s lebegpontos konstansokat hasznlhatunk. Afelsorolt (enum) konstansok definilsval a tpusokat ismertet fejezetben rszletesen foglalkozunk.

    A C++ nyelv logikai konstansai az igaz rtket kpvisel true s a hamis rtk false. A nyelv egyetlenmutat konstanssal rendelkezik a nullval (0), melyet gyakran a NULL szimblummal jellnk.

    1.2.3.1. Egsz konstansok

    Az egsz konstansok szmjegyek sorozatbl llnak. A szmjegyek decimlis (10-es), oktlis (8-as) vagyhexadecimlis (16-os) szmrendszerbeli jegyek lehetnek. Az egsz konstansok, amennyiben nem elzi megket negatv (-) eljel, pozitv rtkeket jellnek.

    Decimlis (10-es alap) egsz szmokat jellnek azok a konstansok, amelyeknek els szmjegye nem 0,pldul:

    1994, -1990, 32, -1, 0

    Oktlis (8-as alap) egsz konstansok els jegye 0, amelyet oktlis szmjegyek kvetnek:03712, -03706, 040, -01, 0

    Hexadecimlis (16-os alap) egsz konstansokat a 0x, illetve a 0X eltag klnbzteti meg az elz ktkonstans fajttl. Az eltagot hexadecimlis jegyek kvetik:

    0x7cA, -0X7c6, 0x20, -0x1, 0

    Mint ltni fogjuk, a C++ nyelvben egsz szmokat klnbz tpusok reprezentlnak. Az egyes tpusokkztti eltrs az eljel rtelmezsben s a trolsi mretben jelentkezik. A konstansok megadsakor akonstans utn elhelyezett betvel rhatjuk el a konstans rtelmezst.A fenti pldkban kznsges egsz szmokat adtunk meg. Ha azonban eljel nlkli (unsigned) egszetkvnunk hasznlni, akkor az u vagy az U bett kell a szm utn rnunk:

  • 11

    65535u, 0177777U, 0xFFFFu

    Nagyobb eljeles egszek trolsra az n. hossz (long) egszet hasznljuk, amelyet a szm utn helyezett l(kis L) vagy L betvel jellnk:

    19871207L, 0x12f35e7l

    Utols lehetsgknt az U s L betket egytt hasznlva eljel nlkli hossz (unsigned long) egszkonstansokat is megadhatunk:

    3087007744UL, 0xB8000000LU

    1.2.3.2. Karakterkonstansok

    Az ANSI (egybjtos) karakterkonstansok egyszeres idzjelek ( ' - aposztrf) kz zrt egy karakterttartalmaz konstansok:

    'a', '1', '@', '', 'ab', '01'

    Az egyetlen karaktert tartalmaz karakter konstansok ltal kpviselt szmrtk a karakter 8-bites ANSI kd-ja. A kt karaktert tartalmaz unicode karakterkonstansok szmrtke 16-bites:

    L'A', L'ab',

    Bizonyos szabvnyos vezrl- s specilis karakterek megadsra az n. escape szekvencikathasznlhatjuk. Az escape szekvenciban a fordtott osztsjel (backslash - \) karaktert specilis karakterek,illetve szmok kvetik, mint ahogy az a kvetkez tblzatbl is lthat.

    rtelmezs ASCII karakter Escape szekvenciacseng BEL '\a'visszatrls BS '\b'lapdobs FF '\f'jsor NL (LF) '\n'kocsi-vissza CR '\r'vzszintes tabulls HT '\t'fggleges tabulls VT '\v'aposztrf ' '\''idzjel " '\"'backslash \ '\\'krdjel ? '\?'ANSI karakter oktliskddal megadva

    ooo '\ooo'

    ANSI karakter hexadeci-mliskddal megadva

    hh '\xhh'

    1.2.3.3. Lebegpontos konstansokA lebegpontos konstans olyan decimlis szm, amely eljeles vals szmot reprezentl. A vals szmltalban egsz rszbl, tizedes trtrszbl s kitevbl tevdik ssze. Az egsz- s trtrszt tizedespont (.)kapcsolja ssze, mg a kitev (10 hatvnykitevje) az e, vagy az E bett kveti:

    .1, -2., 100.45, 2e-3, 11E2, -3.1415925, 31415925E-7A C++ nyelvben a lebegpontos rtkek a trolsukhoz szksges memriaterlet mrettl fggen - ami atrolt vals szm pontossgt s nagysgrendjt egyarnt meghatrozza - lehetnek egyszeres (float),ktszeres (double) vagy nagy (long double) pontossg szmok. A lebegpontos konstansok alaphelyzetbendupla pontossg rtkek. Vannak esetek, amikor megelgsznk egyszeres pontossg mveletekkel is,ehhez azonban a konstansokat is egyszeres pontossgknt kell megadni a szmot kvet f vagy F betkfelhasznlsval:

  • 12

    3.1415F, 2.7182f

    Nagy pontossg szmtsok elvgzshez nagy pontossg lebegpontos konstansokat kell definilnunk azl (kis L) vagy az L bet segtsgvel:

    3.1415926535897932385L, 2.7182818284590452354l

    1.2.4. Sztringkonstansok (literlok)

    Az ANSI sztringliterl, amit sztringkonstansnak is szoks hvni, ketts idzjelek kz zrtkaraktersorozatot jelent:

    "Ez egy ANSI sztring konstans!"

    A megadott karaktersorozatot a statikus memriaterleten helyezi el a fordt, s ugyancsak eltrolja asztringet zr '\0' karaktert (nulls byte-ot) is. A sztringkonstans tartalmazhat escape szekvencikat is:

    "\nEz az els sor!\nA msodik sor!\n"

    melyek esetn csak a nekik megfelel karakter (egy byte) kerl trolsra.

    Egyms utn elhelyezked sztring konstansokat szintn egyetlen sztringliterlknt trolja a fordt:"Hossz szvegeget kt vagy" " tbb darabra trdelhetnk."

    A szles karaktereket tartalmaz unicode sztringkonnstansok eltt az L bett kell hasznlnunk:L"Ez egy unicode sztring konstans!"

    1.2.5. Megjegyzsek

    A megjegyzsek olyan karaktersorozatok, melyek elhelyezsnek clja, hogy a program forrskdja jldokumentlt, ezltal egyszeren rtelmezhet, jl olvashat legyen. A C++ nyelvben a megjegyzsekprogramban trtn elhelyezsre /* ... */ jeleken kvl a // (kt perjel) is hasznlhat. A // jel hasznlataesetn a megjegyzst nem kell lezrni, hatsa a sor vgig terjed.

    /* Az albbi rszben megadjuk a vltozk definciit */int i=0; /* segdvltoz */

    // Az albbi rszben megadjuk// a vltozk definciitint i=0; // segdvltoz

    1.2.6. Opertorok s rsjelek

    Az opertorok olyan (egy vagy tbb karakterbl ll) szimblumok, amelyek megmondjk, hogyan kellfeldolgozni az operandusokat. Az opertorok rszletes ismertetsre a tovbbi fejezetekben kerl sor. Ittcsak azrt tettnk rluk emltst, mivel szintn a C++ nyelv alapegysgei (tokenjei). A kvetkeztblzatban minden magyarzat nlkl felsoroltuk a C++ nyelv (szabvnyos) opertorait:

    ! != % %= & && &= () * *=+ ++ += , - -- -= -> . //= < >>= ?: [] ^ ^= sizeof | |= || ~:: .* ->* new delete

    Az rsjelek a C++ nyelvben olyan szimblumokat jellnek amelyeknek csak szintaktikai szerepe van. Azrsjeleket ltalban azonostk elklntsre, a programkd egyes rszeinek kijellsre hasznljuk, ssemmilyen mveletet sem definilnak. Nhny rsjel egyben opertor is.

  • 13

    rsjel Az rsjel szerepe[] Tmb kijellse, mretnek megadsa,() A paramter- s az argumentum lista kijellse,{} Kdblokk vagy fggvny behatrolsa,* A mutat tpus jellse a deklarcikban,, A fggvny argumentumok elvlasztsa,: Cmke elvlasztsa; Az utasts vgnek jellse

    ... Vltoz hosszsg argumentumlista jellse,# Elfordt direktva jellse.

  • 14

    1.3. A C++ program szerkezete

    A C++ nyelven megrt program egy vagy tbb forrsfjlban (fordtsi egysgben, modulban) helyezkedik el,melyek kiterjesztse ltalban .cpp. A programhoz ltalban n. deklarcis (include, header, fej-)llomnyok is csatlakoznak, melyeket az #include elfordt utasts segtsgvel ptnk be a forrsllo-mnyokba.

    1.3.1. Egyetlen modulbl felpl C++ programA C++ program fordtshoz szksges deklarcikat a main() fggvnnyel azonos forrsfjlban, detetszleges szm ms forrsllomnyban is elhelyezhetjk. A main() fggvny kitntetett szerepe abbanll, hogy kijelli a program belpsi pontjt, vagyis a program futsa a main() fggvny indtsvalkezddik. Ezrt rthet az a megkts, hogy minden C++ programnak tartalmaznia kell egy main() nevfggvnyt, de csak egy pldnyban. Az albbi pldban egyetlen forrsfjlbl ll C++ program szerkezetekvethet nyomon:

    #include // Elfordt utastsok#define EGY 1#define KETTO 2

    using namespace std; // Globlis defincik sint sum(int, int); // deklarcikint e=8;

    //A main fggvny defincijavoid main(){ int a; // Loklis defincik s a= EGY; // deklarcik, utastsok int b = KETTO; e=sum(a,b); cout

  • 15

    1.3.2. Tbb modulbl ll C++ program

    A C++ nyelv tartalmaz eszkzket a modulris programozs elvnek megvalstshoz. A modulrisprogramozs lnyege, hogy minden modul nll fordtsi egysget kpez, melyeknl rvnyesl azadatrejts elve. Mivel a modulok kln-kln lefordthatk, nagy program fejlesztse, javtsa esetn nemszksges minden modult jrafordtani. Ez a megolds jelentsen cskkenti a futtathat programellltsnak idejt. Az adatrejts elvt a ksbbiekben trgyalsra kerl fjlszint rvnyessgi tartomny(lthatsg, scope), nvterletek (namespace) s a trolsi osztlyok biztostjk. Ezek megfelelhasznlatval a modul bizonyos nevei kvlrl (extern) is lthatk lesznek, mg a tbbi nv elrhetsge amodulra korltozdik.

    A tbb modulbl ll C++ program fordtsnak bemutatshoz az elz alfejezet pldjt vgjuk kett! ACppProg1.cpp fjl csak a main() fggvnyt s a CppProg2.cpp llomnyban elhelyezked sum() fggvnylerst (prototpust) tartalmazza. Az extern kulcssz jelzi, hogy a sum() fggvnyt ms modulban kell aszerkesztnek keresnie.

    #include // Elfordt utastsok#define EGY 1#define KETTO 2

    using namespace std; // Globlis defincik sextern int sum(int, int); // deklarcikint e=8;

    //A main fggvny defincijavoid main(){ int a; // Loklis defincik s a= EGY; // deklarcik, utastsok int b = KETTO; e=sum(a,b); cout

  • 16

    1.4. Alaptpusok, vltozk, konstansok

    A C++ nyelvben minden felhasznlt nvrl meg kell mondanunk, hogy mi az s hogy mire szeretnnkhasznlni. E nlkl a fordt ltalban nem tud mit kezdeni az adott nvvel. A C++ nyelv szhasznlatvallve mindig deklarlnunk kell az ltalunk alkalmazni kvnt neveket. A deklarci (lers) sorn csak a nvtulajdonsgait (tpus, trolsi osztly, lthatsg stb.) kzljk a fordtval. Ha azonban azt szeretnnk, hogyaz adott deklarcinak megfelel memriafoglals is vgbemenjen, defincit kell hasznlnunk. A definciteht olyan deklarci, amely helyfoglalssal jr. Ugyanazt azt a nevet tbbszr is deklarlhatjuk, azonbanaz egyms kvet deklarciknak egyeznik kell. Ezzel szemben valamely nv defincija csak egyetlen-egyszer szerepelhet a programban. A fordt szmra a deklarci (definci) sorn kzlt egyik legfon-tosabb informci a tpus.

    1.4.1.A C++ nyelv tpusai

    A C++ nyelv tpusait tbbflekppen csoportosthatjuk. Az els csoportostst a trolt adatok jellege alapjnvgezzk:

    Csoport Mely tpusokat tartalmazzaIntegrl (egsz jelleg) tpusok, (melyekfelhasznlhatk a switch utastsban.)

    bool, char, wchar_t, int, enum

    Aritmetikai tpusok (a ngy alapmveletelvgezhet rajtuk).

    Az integrl tpusok, kiegsztve a float,double s a long double tpusokkal.

    Skalr tpusok (for ciklusvltozkhozhasznlhatk).

    Az aritmetikai adattpusok, a referen-cik s a mutatk

    Aggregate (tbb rtk trolsra alkal-mas tpusok).

    Tmb s a felhasznli tpusok (class,struct, union).

    Az elzeknl sokkal egyszerbb, azonban bizonyos szempontbl kibvtett rtelmezst jelenti atpusoknak az a csoportosts, amely az alaptpusokat (base types) s a szrmaztatott (derived) tpusokatklnbzteti meg. Az alaptpusokhoz a char, az eljeles s eljel nlkli egszek s a lebegpontos tpusoktartoznak (ez nem ms, mint az aritmetikai tpusok csoportja az enum tpus nlkl). Az elemi adattpusokjellemzit tblzatban foglaltuk ssze:

    Adattpus rtkkszlet Mret(bjt)

    Pontossg(jegy)

    bool false, true 1

    char -128..127 1

    signed char -128..127 1unsigned char 0..255 1wchar_t 0..65535 2

    int -2147483648..2147483647 4unsigned int 0..4294967295 4short int -32768..32767 2unsigned short 0..65535 2long int -2147483648..2147483647 4unsigned long 0..4294967295 4

    float 3.4E-38..3.8E+38 4 6

    double 1.7E-308..1.7E+308 8 15

    long double 3.4E-4932..3.4E+4932 10 19

    A szrmaztatott tpusok csoportja az alaptpusok felhasznlsval felptett tmb, fggvny, mutat, osztly,struktra s uni tpusokat tartalmazza.

  • 17

    A csoportostst ki kell egsztennk, egy olyan tpusnvvel, amely ppen a tpus hinyt jelzi (res tpus) -ez a nv a void. A void tpuselrs hasznlatra a ksbbiek sorn, a mutatkat s a fggvnyeket trgyalfejezetekben, visszatrnk.

    1.4.1.1. Tpuselrsok, tpusmdostkAz alaptpusokhoz tartoz char, int s double tpuselrsokhoz bizonyos ms kulcsszavakat (tpusm-dostkat) kapcsolva, jabb tpuselrsokhoz jutunk, amelyek rtelmezse eltr a kiindulsi elrstl. Atpusmdostk a hatsukat ktfle mdon fejtik ki. A short s a long mdostk a trolsi hosszat, mg asigned s az unsigned az eljel rtelmezst szablyozzk.

    A short int tpus egy rvidebb (2 byte-on trolt), mg a long int tpus egy hosszabb (4 byte-on trolt) egsztpust definil. A long double tpus az adott szmtgpen rtelmezett legnagyobb pontossg lebegpontostpust jelli.

    Az egsz tpusok lehetnek eljelesek (signed) s eljel nlkliek (unsigned). Az int tpusok (int, short int,long int) alaprtelmezs szerint pozitv s negatv egszek trolsra egyarnt alkalmasak, mg a char tpuseljelnek rtelmezse implementcifgg. A fenti ngy tpus eljeles vagy eljel nlkli voltaegyrtelmv tehet a signed, illetve az unsigned tpusmdostk megadsval.A tpusmdostk nmagukban tpuselrsknt is hasznlhatk. Az albbiakban (bc-sorrendben)sszefoglaltuk a lehetsges tpuselrsokat. Az elrsok soronknt azonos tpusokat jellnek.

    boolcharwchar_tdoubleenum tpusnvfloatint, signed, signed intlong doublelong int, long, signed long, signed long intsigned charshort int, short, signed short, signed short intstruct tpusnvclass tpusnvunion tpusnvunsigned charunsigned int, unsignedunsigned long, unsigned long intunsigned short, unsigned short intvoid

    1.4.1.2. TpusminstkA tpuselrsokat tpusminstvel egytt hasznlva a deklarlt azonosthoz az albbi kt tulajdonsgegyikt rendelhetjk. A const kulcsszval olyan nevet definilhatunk, melynek rtke nem vltoztathat meg(csak olvashat).

    A volatile tpusminstvel olyan nv hozhat ltre, melynek rtkt a programunktl fggetlen kd (pld-ul egy msik fut folyamat vagy szl) is megvltoztathat. A volatile kzli a fordtval, hogy nem tudmindent, ami az adott vltozval trtnhet. (Ezrt pldul a fordt minden egyes, ilyen tulajdonsgvltozra trtn hivatkozskor, a memribl veszi fel az vltozhoz tartoz rtket.)

    int constconst intvolatile charlong int volatile

  • 18

    1.4.1.3. A felsorolt tpus (enum)

    Az enum olyan adattpust jell, melynek lehetsges rtkei egy konstanshalmazbl kerlnek ki. Az enumtpust konstansnevek felhasznlsval szrmaztatjuk:

    enum azonost { felsorols }

    A felsorolsban szerepl konstansok az int tpus rtktartomnybl vehetnek fel rtket. Nzznk nhnypldt a felsorolt tpus ltrehozsra!

    enum valasz { igen, nem, talan};

    A fenti programsor feldolgozsa utn ltrejn a felsorolt tpus (enum valasz vagy valasz), s hrom egszkonstans igen, nem s talan. A fordt a felsorolt konstansoknak balrl jobbra haladva, nullval kezdveegsz rtkeket feleltet meg. A pldban az igen, nem s talan konstansok rtke 0, 1 s 2.

    Ha a felsorolsban a konstans nevt egyelsg jel s egy egsz rtk kveti, akkor a konstanshoz a fordt amegadott szmot rendeli, s a tle jobbra es konstansok ezen kiindulsi rtktl kezdden kapnak rtket:

    enum valasz { igen, nem=10, talan};

    Ekkor az igen, nem s talan konstansok rtke rendre 0, 10 s 11 lesz. A felsorolsban azonos rtkektbbszr is szerepelhetnek:

    enum valasz { igen, nem=10, lehet, talan=10};

    A enum tpust elssorban csoportos konstansdefinilsra hasznljuk - ekkor a tpusnevet el is hagyhatjuk:enum { also=-2, felso, kiraly=1, asz };

    ahol a konstansok rtkei sorban -2, -1, 1 s 2.

    Az albbi deklarcit hasznlva, a programrszlet C++-ban figyelmeztetshez vezet:

    enum szin {fekete, kek, zold};

    enum szin col;int kod;

    col=zold; // rendbenkod=col; // rendben, a kod rtke 2 leszcol=26; // figyelmeztets!col=(szin)26; // ok!

    Az enum deklarciban megadott nv tpusnvknt is hasznlhat a kulcssz megadsa nlkl:

    enum Boolean {False, True};

    Boolean x = False;enum Boolean y = x;

    1.4.2. Egyszer vltozk definilsaA C++ program memriban ltrehozott trolit nvvel ltjuk el, hogy tudjunk rjuk hivatkozni. A nvsegtsgvel a trolhoz rtket rendelhetnk, illetve lekrdezhetjk az eltrolt rtket. A nvvel elltotttrolkat a programozsi nyelvekben vltoznak szoks nevezni. Nzzk elszr ltalnos formban, hogyannz ki a vltozk defincija (deklarcija):

    trolsi osztly tpus tpus ... vltoznv=kezdrtk , .. ;

    Az ltalnostott formban a jelek az opcionlisan megadhat rszeket jellik, mg a hrom pont az elzdefincis elem ismtelhetsgre utal. Kln felhvjuk a figyelmet arra, hogy a deklarcis sort pontos-vesszvel kell lezrni.

  • 19

    int alfa;int beta=4;int gamma, delta=9;

    A deklarciban a tpust megelzheti nhny alapsz (auto, register, static vagy extern), amelyek azobjektum trolsval kapcsolatban tartalmaznak elrsokat. Az elrsok, amiket trolsi osztlynakneveznk, meghatrozzk az objektum elhelyezkedst, lthatsgt s lettartamt. Minden vltozhoztartozik trolsi osztly, mg akkor is, ha azt kln nem adtuk meg. Ha a vltozt a fggvnyeken kvldefiniljuk, akkor az alaprtelmezs szerint globlis (ms modulbl elrhet - extern) trolsi osztllyalrendelkezik, mg a fggvnyeken bell definilt vltozk alaphelyzetben automatikus (auto) vltozk.

    Az extern trolsi osztly vltozk akkor is kapnak kezdrtket (nullt), ha nem adunk meg semmit. Afggvnyen bell definilt automatikus vltozkat tetszleges (futs idej) kifejezssel inicializlhatjuk.Ezzel szemben a globlis elrs vltozk kezdrtkeknt csak fordtsi idej kifejezseket adhatunk meg.

    1.4.3.. Sajt tpusok ellltsaA C++ nyelv tpusnevei, a tpusmdostk s a tpusminstk megadsval, ltalban tbb alapszbltevdnek ssze, pldul:

    volatile unsigned long int

    Definiljunk a fenti tpus felhasznlsval egy kezdrtk nlkli vltozt!volatile unsigned long int idozites;

    A C++ nyelv tartalmaz egy specilis trolsi osztlyt (typedef), amely lehetv teszi, hogy rvnyestpusokhoz szinonim neveket rendeljnk:

    typedef volatile unsigned long int tido;

    Az j tpussal mr sokkal egyszerbb az idozites vltozt definilni:tido idozites;

    Klnsen hasznos a typedef hasznlata sszetett tpusok esetn, ahol a tpusdefinci felrsa nem mindigtrivilis. A tpusok ksztse azonban mindig eredmnyes lesz, ha a kvetkez tapasztalati szably betartjuk:

    rjunk fel egy kezdrtk nlkli vltozdefincit, ahol az a tpus szerepel, amelyhez szinonimnevet kvnunk kapcsolni!

    rjuk a definci el a typedef kulcsszt, ami ltal a megadott nv nem vltozt, hanem tpust fogjellni!

    1.4.5. Konstansok a C++ nyelvben

    A C++ nyelvben tbbfle mdon hasznlhatunk konstansokat. Az els lehetsg a const tpusminstmegadst jelenti a vltozdefinciban. A vltozk rtke ltalban megvltoztathat:

    int a;a=7;

    Ha azonban a definciban szerepel a const kulcssz, a vltoz "csak olvashat" lesz, vagyis rtkt nemlehet kzvetlenl megvltoztatni. (Ekkor a definciban ktelez a kezdrtk megadsa.)

    const int a=30;a=7; // Hibajelzst kapunk a fordttl.

    A msik, szintn gyakran hasznlt megolds, amikor az elfordt #define utastsval ltrehozott makrkhordoznak konstans rtkeket: Az elfordt ltal hasznlt neveket csupa nagybetvel szoks rni:

  • 20

    #define FEKETE 0#define KEK 1#define ZOLD 2#define PIROS 4#define PI 3.14159265

    void main(){

    int a=KEK;double f;a += PIROS;f = 90*PI/180;

    }

    Ezek a szimbolikus nevek valjban konstans rtkeket kpviselnek. Az elz programrszlet az elfordtsutn:

    void main(){

    int a=1;double f;a+=4;f=90*3.14159265/180;

    }

    A harmadik lehetsg, az enum tpus hasznlatt jelenti, ami azonban csak egsz (int) tpus konstansokesetn alkalmazhat. Az elz pldban szerepl sznkonstansokat az albbi alakban is elllthatjuk:

    enum szinek {fekete, kek, zold, piros=4};

    void main(){

    int a=kek;a+ = piros;

    }

    Az enum s a const konstansok igazi konstansok, hisz nem trolja ket a memriban a fordt. Mg a#define konstansok a definils helytl a fjl vgig fejtik hatsukat, addig az enum s a constkonstansokra a szoksos C++ lthatsgi s lettartam szablyok rvnyesek. ltalban is elmondhat, hogya C++ nyelvben javasolt elkerlni a #define konstansok hasznlatt, mivel bizonyos esetekben hibtvihetnek a forrsprogramba.

    1.4.6 rtkek, cmek, mutatk s referencik

    A vltozk ltalban az rtkads sorn kapnak rtket, melynek ltalnos alakja:

    vltoz = rtk;

    A C++ nyelven az rtkads opertor s a fenti utasts valjban egy kifejezs, amit a fordtprogramrtkel ki. Az rtkads opertornak bal- s jobb oldaln egyarnt szerepelhetnek kifejezsek, melyekazonban lnyegileg klnbznek egymstl. A baloldalon szerepl kifejezs azt a vltozt jelli ki (cmzimeg) a memriban, ahova a jobb oldalon megadott kifejezs rtkt be kell tlteni.

    1.4.6.1. Balrtk s jobbrtk

    A fenti alakbl kiindulva a C++ nyelv kln nevet ad a ktfajta kifejezsnek. Annak a kifejezsnek azrtke, amely az egyenlsgjel bal oldaln ll, a balrtk (lvalue), mg a jobboldalon szerepl kifejezsrtke a jobbrtk (rvalue). Vegynk pldaknt kt egyszer rtkadst!

    int a; a = 12; a = a + 1;

    Az els rtkads sorn az a vltoz mint balrtk szerepel, vagyis a vltoz cme jelli ki azt a trolt,ahova a jobboldalon megadott konstans rtket be kell msolni. A msodik rtkads sorn az a vltoz az

  • 21

    rtkads mindkt oldaln szerepel. A baloldalon ll a ugyancsak a trolt jelli ki a memriban (lvalue),mg a jobboldalon ll a egy jobbrtk kifejezsben szerepel, melynek rtkt (13) a fordt meghatrozzaaz rtkads elvgzse eltt.

    1.4.6.2. Ismerkeds a mutatval s a referencival

    A mutatk hasznlata a C++ nyelvben alapvet kvetelmny. Ebben a rszben csak a mutatk fogalmtvezetjk be, mg alkalmazsukkal a knyvnk tovbbi fejezeteiben rszletesen foglalkozunk.

    Definiljunk egy egsz tpus vltozt! A definci hatsra a memriban ltrejn egy (int tpus) trol,melybe bemsoldik a kezdrtk.

    int x=7;

    Az int *p; definci hatsra szintn ltrejn egy trol, melynek tpusa int*. Ez a vltoz int tpusvltoz cmnek trolsra hasznlhat, melyet a cme mvelet sorn szerezhetnk meg:

    p = &x;

    A mvelet utn az x nv s a *p rtk ugyanarra a memriaterletre hivatkoznak. (A *p kifejezs a p ltalmutatott trolt jelli.) A

    *p = x +13;

    kifejezs feldolgozsa sorn az x rtke 20-ra mdosul.

    A hivatkozsi (refenrcia) tpus felhasznlsval mr ltez vltozkra hivatkozhatunk, alternatv nevetdefinilva. A definci ltalnos formja:

    tpus & azonost = vtoz;

    A referencia definilsakor ktelez kezdrtket adnunk. A fentiekben definilt x vltozhoz referencit iskszthetnk:

    int x = 7;int & r = x;

    Ellenttben a mutatkkal, a referencia trolsra ltalban nem jn ltre kln vltoz. A fordt egyszerenmsodik nvknt egy j nevet ad az x vltoznak (r). Ennek kvetkeztben az albbi kifejezs kirtkelseutn szintn 20 lesz az x vltoz rtke:

    r = x +13;

    Ellenttben a p mutatval, melynek rtke (ezltal a mutatott trol) brmikor megvltoztathat, az rreferencia a vltozhoz kttt.

    Ha a referencit konstans rtkkel, vagy eltr tpus vltozval inicializljuk, a fordt elszr ltrehozza ahivatkozs tpusval megegyez trolt, majd ide msolja a kezdrtkknt megadott kifejezs rtkt.

    int & n = '\n'; unsigned b = 2001;int & r = b;r++; // b nem vltozik!

    Sajt mutat-, illetve referenciatpus szintn ltrehozhat a typedef trolsi osztly felhasznlsval:

    int x = 7;typedef int & tri;typedef int * tpi;tri r = x;tpi p = &x;

  • 22

    1.4.6.3.A void * tpus ltalnos mutatk

    Az elz pldkban pointerekkel mutattunk int tpus vltozkra. A vltoz elrshez azonban nemelegend annak cmt trolnunk (ez van a mutatban), hanem definilnunk kell a trol mrett is, amit amutat tpusa kzvett a fordtnak. A C++ nyelv tpus nlkli, n. ltalnos mutatk hasznlatt is lehetvteszi:

    int x;void * ptr=&x;

    amely azonban sohasem jell ki trolt. Ha ilyen mutatval szeretnnk a hivatkozott vltoznak rtket adni,akkor felhasznli tpuskonverzival (cast) tpust kell rendelnnk a cm mell, pldul:

    *(int *)ptr=5;

    1.4.6.4. Tbbszrs indirektsg mutatkA mutatkat tbbszrs indirektsg kapcsolatok esetn is hasznlhatunk. Ekkor a mutatk defincijbantbb csillag (*) szerepel. Tekintsnk nhny defincit, s mondjuk meg, hogy, mi a ltrehozott vltoz:

    int x; x egy egsz tpus vltoz.

    int * p; p egy int tpus mutat (amely int vltozra mutathat).

    int **q; q egy int* tpus mutat (amely int* vltozra, vagyis egszre mutat pointerre mutathat).

    Mr emltettk, hogy a C++ nyelven megadott tpusok elgg sszetettek is lehetnek. A bonyolultsgfeloldsban, a deklarcik rtelmezsben a mutatk esetn is ajnlott a typedef hasznlata:

    typedef int * iptr; // egszre mutat pointer tpusaiptr p, *q;

    vagy

    typedef int * iptr; // egszre mutat pointer tpusatypedef iptr * ipptr; // iptr tpus objektumra mutat pointer tpusaiptr p;ipptr q;

    A defincik megadsa utn kijelenthetjk, hogy az

    x = 7;p = &x;q = &p;x = x + *p + **q;

    utastsok lefutst kveten az x vltoz rtke 21 lesz.

  • 23

    1.5. Opertorok s kifejezsek

    Az eddigiek sorn gyakran hasznltunk olyan utastsokat (mint pldul az rtkads), amelyekpontosvesszvel lezrt kifejezsbl lltak. A kifejezsek egyetlen operandusbl, vagy az operandusok s amveleti jelek (opertorok) kombincijbl plnek fel. A kifejezs kirtkelse valamilyen rtkkiszmtshoz vezethet, fggvnyhvst idzhet el vagy mellkhatst (side effect) okozhat. Az esetektbbsgben a fenti hrom tevkenysg valamilyen kombincija megy vgbe a kifejezsek feldolgozsa(kirtkelse) sorn.

    A operandusok a C++ nyelv azon elemei, amelyeken az opertorok fejtik ki hatsukat. Azokat azoperandusokat, amelyek nem ignyelnek tovbbi kirtkelst elsdleges (primary) kifejezseknek nevezzk.Ilyenek az azonostk, a konstans rtkek, a sztringliterlok s a zrjelben megadott kifejezsek.Hagyomnyosan az azonostkhoz soroljuk a fggvnyhvsokat, valamint a tmbelem- s a struktratag-hivatkozsokat is.

    A kifejezsek kirtkelse sorn az opertorok lnyeges szerepet jtszanak. Az opertorokat tbb szempontalapjn lehet csoportostani. A csoportostst elvgezhetjk az operandusok szma szerint. Azegyoperandus (unary) opertorok esetn a kifejezs ltalnos alakja:

    op operandus vagy operandus op

    Az els esetben, amikor az opertor (op) megelzi az operandust elrevetett (prefixes), mg a msodikesetben htravetett (postfixes) alakrl beszlnk:

    -a a++ sizeof(a) float(a) &a

    Az opertorok tbbsge kt operandussal rendelkezik - ezek a ktoperandus (binary) opertorok:

    operandus1 op operandus2

    Ebben a csoportban a hagyomnyos aritmetikai mveletek mellett megtallhatk a bitmveletek elvgzsreszolgl opertorok is:

    a+b a!=b a kzvetett tagkivlaszt opertor.:: rvnyessgi kr op.. kzvetlen tagkivlaszt opertor

    2. Egyoperandus asszociativits: jobbrl->balra! logikai tagads (NEM)~ bitenknti negls+ + eljel- - eljel

    ++ lptets elre-- lptets vissza& a cme opertor* indirektsg opertor

  • 24

    typeid futsidej tpusazonosts(tpus) explicit tpuskonverzi

    dynamic_cast futsidej ellenrztt tpustalaktsstatic_cast fordtsidej ellenrztt tpustalakts

    reinterpret_cast ellenrizetlen tpustalaktsconst_cast konstans tpustalakts

    sizeof az operandus bjtban kifejezett mrett adja megnew trterlet dinamikus foglalsa

    delete trterlet dinamikus felszabadtsa

    3. Osztlytagok elrse asszociativits: balrl->jobbra.* osztlytagra trtn indirekt hivatkozs opertora

    ->* mutatval megadott osztlyobjektum tagjra valindirekt hivatkozs opertora

    4. Multiplikatv asszociativits: balrl->jobbra* szorzs/ oszts

    % maradk

    5. Additv asszociativits: balrl->jobbra+ sszeads- kivons

    6. Biteltols asszociativits: balrl->jobbra> eltols jobbra

    7. sszehasonlt asszociativits: balrl->jobbra< kisebb

    nagyobb

    >= nagyobb vagy egyenl

    8. Egyelsg asszociativits: balrl->jobbra== egyenl!= nem egyenl

    9. - 13. asszociativits: balrl->jobbra9. & bitenknti S10. ^ bitenknti VAGY11. | bitenknti kizr VAGY12. && logikai S13. || logikai VAGY

    14. Feltteles asszociativits: jobbrl->balra?: a ? x : y jelentse: "ha a akkor x, klnben y"

    15. rtkads asszociativits: jobbrl->balra= egyszer rtkads*= szorzat megfeleltetse/= hnyados megfeleltetse

    %= maradk megfeleltetse+= sszeg megfeleltetse-= klnbsg megfeleltetse

  • 25

    &= bitenknti S megfeleltetse^= bitenknti kizr VAGY megfeleltetse|= bitenknti VAGY megfeleltetse

    = jobbra eltolt megfeleltetse

    16. Vessz asszociativits: balrl->jobbra, kirtkels

    A elfordt mveletei# sztringbe illeszts

    ## szvegbe illesztsdefined makr ltezsnek vizsglata

    A felhasznli tpushoz kapcsoldan a C++ lehetsget knl az opertorok tbbsgnek tdefinilsra(operator overloading) az albbi opertorok kivtelvel:

    . .* :: ?:

    Az tdefinils sorn az egyes opertorok j rtelmezst kaphatnak, azonban a fenti tblzat szerintiprecedencia s asszociativits nem vltoztathat meg.

    1.5.1.Precedencia s asszociativits

    Annak rdekben, hogy bonyolultabb kifejezseket is helyesen tudjunk hasznlni, meg kell ismerkednnk azelsbbsgi (precedencia) szablyokkal, amelyek meghatrozzk a kifejezsekben szerepl mveletekkirtkelsi sorrendjt. Az egyes opertorok kztti elsbbsgi kapcsolatot a mveletek tblzatban foglal-tuk ssze. A tblzat csoporjai az azonos precedencival rendelkez opertorokat tartalmazzk. A csoportokmellet kln jeleztk az azonos precedencij opertorokat tartalmaz kifejezsben a kirtkels irnyt,amit asszociativitsnak (csoportostsnak) hvunk. A tblzat els sora a legnagyobb precedencivalrendelkez mveleteket tartalmazza.

    1.5.1.1.Az elsbbsgi (precedencia) szablyAz opertorok precedencija akkor jtszik szerepet a kifejezs kirtkelse sorn, ha a kifejezsbenklnbz precedencij mveletek szerepelnek. Ekkor mindig a magasabb precedencival rendelkezopertort tartalmaz rszkifejezs kerl elszr kirtkelsre, amit az alacsonyabb precedencij mveletekvgrehajtsa kvet. Ennek megfelelen pldul az

    5 + 3 * 4

    kifejezs rtke 17 lesz. Ha az sszeget zrjelbe tesszk, megvltoztatva ezzel a kirtkels sorrendjt(5 + 3) * 4

    32 lesz az eredmny. Ha azonban a kiindulsi kifejezsben a zrjelbe a szorzatot helyezzk

    5 + (3 * 4)

    akkor ismt 17-et kapunk eredmnyknt, hisz ebben az esetben a zrjelezs csak kiemelte, de nemvltoztatta meg a szmts menett.

    1.5.1.2. A csoportostsi (asszociativits) szably

    Egy kifejezsben tbb azonos precedencij mvelet is szerepelhet. Ebben az esetben az opertortblzatcsoportnevei mellett tallhat tmutatst kell figyelembe venni a kirtkels sorn, hisz a precedenciaszably nem alkalmazhat. Az asszociativits azt mondja meg, hogy az adott precedenciaszinten tallhatmveleteket balrl-jobbra vagy jobbrl-balra haladva kell elvgezni.

  • 26

    Az rtkad utastsok csoportjban a kirtkelst jobbrl-balra haladva kell elvgezni. Emiatt C++-banadott a lehetsg tbb vltoz egyttes inicializlsra:

    int a,b,c;a = b = c = 26;

    1.5.2. Mellkhatsok s a rvidzr kirtkels

    Bizonyos mveletek - a fggvnyhvs, a tbbszrs rtkads s a lptets (nvels, cskkents) -feldolgozsa sorn a kifejezs rtknek megjelense mellett bizonyos vltozk is megvltozhatnak. Ezt ajelensget mellkhatsnak (side effect) hvjuk. A mellkhatsok kirtkelsnek sorrendjt nem hatrozzameg a C++ szabvny, ezrt javasolt minden olyan megolds elkerlse, ahol a kifejezs eredmnye fgg amellkhatsok kirtkelsnek sorrendjt, pldul:

    a[i] = i++;

    A mvelet-tblzatbl lthat, hogy a logikai kifejezsek kirtkelse szintn balrl-jobbra haladva trtnik.Bizonyos mveleteknl nem szksges a teljes kifejezst kirtkelni ahhoz, hogy egyrtelm legyen akifejezs rtke. Pldaknt vegyk a logikai S (&&) opertort, amely hasznlata esetn a baloldalioperandus 0 rtke esetn a jobboldali operandus kirtkelse feleslegess vlik. Ezt a kirtkelsi mdotrvidzr (short-circuit) kirtkelsnek nevezzk.

    Ha a rvidzr kirtkelse sorn a logikai opertor jobb oldaln valamilyen mellkhats kifejezs ll,

    x || y++az eredmny nem mindig lesz az, amit vrunk. A fenti pldban x nem nulla rtke esetn az y lptetsremr nem kerl sor.

    1.5.3. Elsdleges opertorokAz els csoportba azok az opertorok tartoznak ( (), [], ->, . ), amelyekkel a ksbbiek sornismerkednk meg rszletesen, hiszen hozzjuk specilis C++ nyelvi szerkezetek kapcsoldnak. Nevezetesena fggvnyhvs (fv(argumentumok)), a tmbindexels (tomb[index]) s a osztlytagra val hivatkozs(str.tag vagy pstr->tag) opertorokrl van sz. A zrjel () opertor azonban ketts szereppelrendelkezik. Mint mr emltettk, zrjelek segtsgvel a kifejezsek kirtkelse megvltoztathat. Azrjelbe helyezett kifejezs tpusa s rtke megegyezik a zrjel nlkli kifejezs tpusval s rtkvel.

    1.5.4. Aritmetikai opertorok

    Az aritmetikai opertorok csoportja a szoksos ngy alapmveleten tlmenen a maradkkpzs opertort(%) is tartalmazza. Az sszeads (+), a kivons (-), a szorzs (*) s az oszts (/) mvelete egsz slebegpontos szmok esetn egyarnt hasznlhat. Az oszts egsz tpus operandusok esetn egszosztstjell.

    Megjegyezzk, hogy a + s a - opertorok egyik vagy mindkt operandusa mutat is lehet, ekkor pointerarit-metikrl beszlnk. A megengedett pointeraritmetikai mveletek, ahol a q s a p (nem void* tpus)mutatk, az i pedig egsz (int vagy long):

    Mvelet Kifejezs Eredmnykt mutat kivonhat egymsbl q-p egsza mutathoz egsz szm hozzadhat p+i mutata mutatbl egsz szm kivonhat p-i mutat

  • 27

    1.5.5. sszehasonlt s logikai opertorok

    A C++ nyelvben a logikai tpus is az egsz tpusok kz tartozik (false rtke 0, true rtke 1). Azutastsokban szerepl felttelek tetszleges kifejezsek lehetnek, melyek nulla vagy nem nulla rtkeszolgltatja a logikai hamis, illetve igaz eredmnyt. A felttelekben gyakran kell sszehasonltanunkbizonyos rtkeket, hogy a program tovbbi mkdsrl dntsnk. Az sszehasonlts elvgzsre azsszehasonlt opertorokat hasznljuk, melyeket az albbi tblzatban foglaltuk ssze:

    Matematikai alak C++ kifejezs Jelentsa < b a < b a kisebb, mint ba b a b a > b a nagyobb, mint ba b a >= b a nagyobb vagy egyenl, mint ba = b a == b a egyenl b-vela b a != b a nem egyenl b-vel

    Brmelyik fenti kifejezs int tpus, s a kifejezs rtke 1, ha a vizsglt relci igaz, illetve 0, ha nem igaz.

    Ahhoz, hogy bonyolultabb feltteleket is ssze tudjunk hasonltani, a relcis opertorok mellett szksgnkvan a logikai opertorokra is. C++-ban a logikai S (&&), a logikai VAGY (||) s a logikai NEM (!)mveletek hasznlhatk a felttelek megfogalmazsa sorn. A logikai opertorok mkdst n.igazsgtblval rjuk le:

    a !a a b a&&b a b a||b0 1 0 0 0 0 0 01 0 0 1 0 0 1 1

    1 0 0 1 0 11 1 1 1 1 1

    logikaitagads

    logikai S mvelet logika VAGYmvelet

    1.5.6. Lptet opertorokA vltozk rtkt lptet opertorok a magas szint nyelvekben csak ritkn fordulnak el. C++ nyelvlehetsget biztost valamely vltoz rtknek eggyel val nvelsre ++ (increment), illetve eggyel valcskkentsre -- (decrement). A lptet opertorok az aritmetikai tpusokon kvl a mutatkra isalkalmazhatk, ahol azonban nem 1 bjttal val elmozdulst, hanem a szomszdos elemre val lptetstjelentik.

    Az opertorok csak balrtk operandussal hasznlhatk, azonban mind az elrevetett, mind pedig ahtravetett forma alkalmazhat:

    int a;

    // prefixes alakok:++a; --a;

    // postfixes alakok:a++; a--;

    }

    Ha az opertorokat a fenti programban bemutatott mdon hasznljuk, nem ltszik klnbsg az elrevetetts htravetett forma kztt, hisz mindkt esetben a vltoz rtke lptetdik. Ha azonban az opertortbonyolultabb kifejezsben alkalmazzuk, akkor a prefixes alak hasznlata esetn a lptets a kifejezskirtkelse eltt megy vgbe s a vltoz az j rtkvel vesz rszt a kifejezs kirtkelsben:

    int x, n=5;

  • 28

    x = ++n;

    A pldban szerepl kifejezs kiszmtsa utn mind az x, mind pedig az n vltoz rtke 6 lesz.double x, n=5.0;x = n++;

    A kifejezs feldolgozsa utn az x vltoz rtke 5.0, mg az n vltoz rtke 6.0 lesz.

    1.5.7. BitmveletekA C++ nyelv hat opertort tartalmaz, amelyekkel klnbz bitenknti mveleteket vgezhetnk char,short, int s long tpus eljeles s eljel nlkli adatokon.

    1.5.7.1. Bitenknti logikai mveletekA mveletek els csoportja, a bitenknti logikai mveletek, lehetv teszik hogy biteket teszteljnk,trljnk vagy belltsunk:

    Opertor Mvelet~ 1-es komplemens& bitenknti S| bitenknti VAGY^ bitenknti kizr VAGY

    A bitenknti logikai mveletek mkdsnek lerst az albbi tblzat tartalmazza, ahol a 0 s az 1szmjegyek a trlt, illetve a belltott bitllapotot jellik.

    a b a & b a | b a ^ b ~a0 0 0 0 0 10 1 0 1 1 11 0 0 1 1 01 1 1 1 0 0

    A bitenknti logikai mveletek a C++ nyelv szintjn biztostjk a szmtgp hardverelemeinekprogramozst. A perifrik tbbsgnek alacsony szint vezrlse bizonyos bitek belltst, illetve trlstjelenti. Ezeket a mveleteket sszefoglal nven "maszkolsnak" nevezzk. Az albbi pldkban a short inttpus 2525 szm 4. s 13. bitjeit kezeljk:

    short int a = 2525;

    Mvelet Maszk C++ utasts EredmnyBitek 1-be lltsa 0010 0000 0001 0000 a = a | 0x2010; 10717 (0x29dd)Bitek trlse 1101 1111 1110 1111 a = a & 0xdfef; 2509 (0x09cd)Bitek neglsa 0010 0000 0001 0000 a = a ^ x2010;

    a = a ^ 0x2010;10701 (0x29cd)2525 (0x09dd)

    Az sszes bit neglsa a = ~a; -2526 (0xf622)

    1.5.7.2. Biteltol mveletekA bitmveletek msik csoportjba, a biteltol (shift) opertorok tartoznak. Az eltols balra () egyarnt elvgezhet. Az eltols sorn a baloldali operandus bitjei annyiszor lpnek balra (jobbra),amennyi a jobboldali operandus rtke. A felszabadul bitpozcikba 0-s bitek kerlnek, mg a kilp bitekelvesznek.

    short int a;

  • 29

    rtkads Binris rtk Mvelet Eredmny Binris eredmnya=2525; 0000 1001 1101 1101 a=a3; 315 (0x013b) 0000 0001 0011 1011a=-2525; 1111 0110 0010 0011 a=a>>3; -316 (0xfec4) 1111 1110 1100 0100

    Az eredmnyeket megvizsglva lthatjuk, hogy az 1 bittel val balra eltols sorn az ax rtke ktszeresre(21) ntt, mg kt lpssel jobbra eltolva, ax rtke negyed (22) rszre cskkent. ltalnosan ismegfogalmazhat, hogy valamely egsz szm bitjeinek n lpssel trtn balra tolsa a szm (2n) rtkkelval megszorzst eredmnyezi. Az m bittel val jobbra eltols pedig (2m) rtkkel elvgzett egszosztsnak felel meg.

    1.5.8. rtkad opertorok

    Mr emltettk, hogy C++ nyelvben az rtkads egy olyan kifejezs, amely a baloldali operandus ltalkijellt trolnaknak adja a jobboldalon megadott kifejezs rtkt, msrszt pedig ez az rtk egyben azrtkad kifejezs rtke is. Ebbl kvetkezik, hogy rtkads tetszleges kifejezsben szerepelhet.

    Ha az a s b int tpus vltozk, akkor az rtkads hagyomnyos formi

    a = 13;b = (a+4)*7-30;

    sorn az a vltoz rtke 13, mg a b vltoz 89 lesz. Felrhat azonban olyan, ms nyelvektl idegenkifejezs is,

    b=2*(a=4)-5;

    ahol az a (4) s b (3) vltozk egyarnt rtket kapnak.

    Az rtkad opertorok kirtkelse jobbrl-balra haladva trtnik. Emiatt C++ nyelven hasznlhat atbbszrs rtkads, melynek sorn tbb vltoz veszi fel ugyanazt az rtket:

    a = b = 26;

    Az rtkadsok gyakran hasznlt formja, amikor egy vltoz rtkt valamilyen mvelettel mdostjuk s akeletkez j rtket troljuk a vltozban:

    a = a + 2;

    Az ilyen alak kifejezsek tmrebb formban is felrhatk:

    a += 2;ltalban elmondhat, hogy a

    kif1 = kif1 op kif2

    alak kifejezsek felrsra az n. sszetett rtkads mvelett is hasznlhatjuk:kif1 op = kif2

    A kt felrs egyenrtk, attl a klnbsgtl eltekintve, hogy a msodik esetben a baloldali kifejezskirtkelse csak egyszer trtnik meg. Opertorknt (op) az eddig megismert ktoperandus mveletekhasznlhatk:

  • 30

    Hagyomnyos forma Tmr formaa = a + b a += ba = a - b a -= ba = a * b a *= ba = a / b a /= ba = a % b a %= ba = a >= ba = a & b a &= ba = a | b a |= ba = a ^ b a ^= b

    1.5.9. PointermveletekA C++ nyelvben tallhat kt olyan specilis egyoperandus mvelet, amelyeket mutatkkal kapcsolatbanhasznlunk. A cme (&) mvelet eredmnye az operandusknt megadott trol cme:

    int a, *ptr;

    ptr = &a;

    A cme opertort arra hasznljuk, hogy mutatinkat mr meglv vltozkra irnytsuk. A msikmutatopertor (*) az indirekt hivatkozs elvgzshez szksges:

    *ptr = *ptr + 5;

    A *ptr kifejezs a ptr pointer ltal mutatott trolt jelenti.

    A mutatkkal a fentieken tlmenen tovbbi (aritmetikai) mveleteket is vgezhetnk. A mutat lptetse aszomszdos elemre tbbfle mdon is elvgezhet:

    int *p, *q, h;...

    p = p + 1;p += 1;p++;++p;

    Az elz elemre val visszalpsre szintn tbb lehetsg kzl vlaszthatunk:p = p - 1;p -= 1;p--;--p;

    A kt mutat klnbsge, vagyis a kt mutat kztt elhelyezked elemek szma szintn meghatrozhat:h = p - q;

    1.5.10. A sizeof opertor

    A C++ nyelv tartalmaz egy olyan fordts idejn kirtkelsre kerl egyoperandus opertort, amelytetszleges vltoz, tpus, kifejezs mrett megadja. A

    sizeof vltoz

    sizeof (tpusnv)

    alak kifejezsek rtke egy olyan egsz szm, amely megegyezik a megadott vltoz, illetve tpus bjtbankifejezett mretvel.

  • 31

    1.5.11. A vessz opertorEgyetlen kifejezsben tbb, akr egymstl fggetlen kifejezs is elhelyezhet, a vessz opertorfelhasznlsval. A vessz opertort tartalmaz kifejezs balrl-jobbra haladva kerl kirtkelsre, s akifejezs rtke s tpusa megegyezik a jobboldali operandus rtkvel, illetve tpusval.

    Pldaknt tekintsk az

    x = (y = 3 , y + 2);

    kifejezst. A kirtkels a zrjelbe helyezett vessz opertorral kezddik, melynek sorn elszr az yvltoz kap rtket (3), majd pedig a zrjelezett kifejezs rtke 3+2 vagyis 5 lesz. Vgezetl az x vltozrtkadssal megkapja az 5 rtket.

    A vessz opertort gyakran hasznljuk klnbz vltozk kezdrtkeinek egyetlen utastsban(kifejezsben) trtn belltsra:

    int x, y;double z;

    x = 5, y = 0, z = 1.2345 ;

    Ugyancsak a vessz opertort kell hasznlnunk, ha kt vltoz rtkt egyetlen utastsban kvnjukfelcserlni (harmadik vltoz felhasznlsval):

    int a=13, b=26, c;

    c = a, a = b, b = c;

    Felhvjuk a figyelmet arra, hogy azok a vesszk, amelyeket a deklarcikban a vltoznevek, illetve afggvnyhvskor az argumentumok elklntsre hasznlunk nem a vessz opertor. Ezrt ezekben azesetekben nem garantlt a balrl-jobbra halad kirtkelsi sorrend.

    1.5.12. A feltteles opertor

    A feltteles opertor (?:) hrom operandussal rendelkezik:

    kif1 ? kif2 : kif3

    A feltteles kifejezsben elszr a kif1 kifejezs kerl kirtkelsre. Amennyiben ennek rtke nem nulla(igaz), akkor a kif2 rtke adja a feltteles kifejezs rtkt. Ellenkez esetben a kettspont utn ll kif3rtke lesz a feltteles kifejezs rtke. Ily mdon a kettspont kt oldaln ll kifejezsek kzl mindigcsak az egyik rtkeldik ki. A feltteles kifejezs tpusa a nagyobb pontossg rszkifejezs tpusvalegyezik meg. Az

    (n > 0) ? 3.141534 : 54321L;

    kifejezs tpusa, fggetlenl az n rtktl mindig double lesz. A feltteles opertort a legklnbzbbclokra hasznlhatjuk. Az esetek tbbsgben a feltteles utastst (if) helyettestjk vele. A kvetkez ktpldban az a s b rtkek kzl kivlasztjuk a nagyobbat:

    Megolds az if utasts felhasznlsval:

    if (a > b) z = a; else z = b;

    Feltteles kifejezssel sokkal tmrebben oldhat meg a feladat:

    z = a > b ? a : b;

  • 32

    Nzznk kt jellegzetes pldt a feltteles opertor alkalmazsra! Az els esetben a ch karakter kirsakor afelhasznland formtumot feltteles kifejezssel adjuk meg. Ha a ch karakter vezrl karakter (kdja < 32),akkor a hexadecimlis kdjt, ellenkez esetben pedig magt a karaktert rjuk ki:

    printf(ch < 32 ? "%02X\n" : "%2c\n", ch);

    Az albbi kifejezs segtsgvel a 0 s 15 kztti rtkeket hexadecimlis szmjeggy alakthatjuk:ch = n >= 0 && n

  • 33

    2. Helyfoglals 10 elem egszre mutat pointertmb szmra: int **pa; pa = new int * [10]; ...

    delete[] pa;

    3. Memriafoglals ellenrzs beptsvel:#include using namespace std;

    int main(){ long * data; long size;

    cout > size;

    // Memriafoglals data = new long [size]; // A foglalas sikeressgnek ellenrzse if ( !data ) { cerr

  • 34

    Tudnunk kell azonban, hogy a mem_kezelo() fggvnyben elvgzett tevkenysg utn (pldul memria-felszabadts) jra vgrehajtdik a memriafoglals. Ennek elkerlse rdekben az exit() fggvnyhvsval kilphetnk a programbl.

    1.5.15. Futsidej tpusazonostsC++-ban a typeid opertor egy type_info tpus objektum (typeinfo) referencijt adja vissza. A type_infoobjektum az operandus tpusrl tartalmaz informcikat (RTTI).

    typeid (kifejezs)typeid (tpusazonost)

    A typeid opertor segtsgvel futsidej tpusazonostst vgezhetnk. (Hibs esetben bad_typeid kivtelkeletkezik.)

    #include using namespace std;...

    if (typeid(A) == typeid (B)) cout

  • 35

    Dinamikus tpustalaktsdynamic_cast < Tpus > (ptr)

    A dinamikus tpus-talaktssal futsidej konverzikat vgezhetnk. Ha a tpus-talakts nem hajthatvgre, akkor kifejezs 0 rtk lesz, s Bad_cast kivtel jn ltre. A Tpus osztlyra mutat pointer,referencia vagy void* tpus kifejezs, mg a ptr operandus pointer vagy referencia tpus kifejezs lehet.

    void __fastcall TForml::ButtonlClick(TObject *Sender){ if (dynamic_cast (Sender)) dynamic_cast (Sender)->Caption="Nyomgomb"}

    Fontos megjegyeznnk, hogy a dynamic_cast vgrehajtshoz n. futsidej tpusazonostsra (run timetype identification - RTTI) van szksg.

    Veszlyes tpustalaktsokreinterpret_cast < Tpus > (arg)

    A kifejezsben a Tpus mutat, referencia, numerikus tpus, fggvnymutat, vagy osztlytagra mutatpointer lehet. Az opertor segtsgvel pldul egy mutatt egsz tpusv, illetve egy egsz tpuskifejezst mutatv alakthatunk A reinterpret_cast kt inkompatibilis mutattpus kztti konverzielvgzsre is hasznlhat.

    int i =reinterpret_cast (&x);

    Statikus tpustalaktsokstatic_cast < Tpus > (arg)

    A static_cast segtsgvel jl definilt, hordozhat s visszafordthat tpuskonverzikat hajthatunk vgre.Mind a Tpus, mint pedig arg tpusnak fordtsi idben ismertnek kell lennie.

    char ch =static_cast (A+1.0);

    Mivel a fenti esetekben a tpusnv megjelenik a konverzis elrsban, explicit tpuskonverzirl beszlnk.

    1.5.16.2. Implicit tpuskonverzik

    ltalnossgban elmondhat, hogy az automatikus konverzik sorn a "szkebb" operandusinformciveszts nlkl konvertldik a "szlesebb" operandus tpusra. Az albbi kifejezs kirtkelsesorn az int tpus i operandus float tpus lesz, ami egyben a kifejezs tpust is jelenti:

    int i=5, j; float f=3.65;i + f;

    Az implicit konverzik azonban nem minden esetben mennek vgbe informciveszts nlkl. Az rtkadss a fggvnyhvs paramterezse sorn tetszleges tpusok kztti konverzi is elfordulhat. Ha a fentipldban az sszeget a j vltoznak feleltetjk meg

    j = i + f;

    akkor bizony adatveszts lp fel, hiszen az sszeg trtrsze elvsz, s 8 lesz a j vltoz rtke.

  • 36

    A kvetkezkben rviden sszefoglaljuk a az x op y alak kifejezsek kirtkelse sorn automatikusanvgrehajtd konverzikat.

    1. A char, a wchar_t, a short, a bool s az enum (felsorolt) tpus adatok automatikusan inttpuss konvertldnak. Ha az int tpus nem alkalmas az rtkk trolsra, akkor unsignedint lesz a konverzi cltpusa. Ez a konverzis szably az egsz konverzi (integralpromotion) nevet viseli. Mivel a fenti konverzik rtk- s eljelhelyes eredmnyt adnak,rtkmegrz konverziknak is szoks nevezni azokat.

    2. Ha az els lps utn a kifejezsben klnbz tpusok szerepelnek, letbe lp a tpusok hierarchijaszerinti konverzi:

    int < unsigned < long < unsigned long < float < double< long double

    A tpus-talakts sorn a kisebb tpus operandus a nagyobb tpusv konvertldik.Az talakts sorn felhasznlt szablyok a "szoksos aritmetikai konverzik" nevet viselik.

    A C++ implicit mutatkonverzival is rendelkezik. Tetszleges tpus mutat talakthat az ltalnos void*mutattpuss. Ellenkez irny konverzihoz explicit tpus-talaktst kell hasznlnunk. Ugyancsakrdemes megjegyezni, hogy a nulla (0) szmrtkkel tetszleges tpus mutat inicializlhat.

    int x=5;void * p=&x;int *q=0;q=static_cast(p);cout

  • 37

    Konstansra mutat konstans rtk pointer:const int ev=1970;const int ae=2001;const int * const aktev=&ev; // int tpus konstansra mutat konstans pointer;aktev = &ae; // Hiba!*aktev= 1993; // Hiba!

    Ugyancsak a const tpus konstansok hasznlata mellett szl az a lehetsg, hogy tmbk defincijban isfelhasznlhatk:

    const maxnum=100;int num[maxnum];

  • 38

    1.6. A C++ nyelv utastsai

    A C++ nyelven megrt program vgrehajthat rsze elvgzend tevkenysgekbl (utastsokbl) pl fel.Az utastsok a strukturlt programozs alapelveinek megfelelen ciklusok, programelgazsok svezrlstadsok szervezst teszik lehetv. A C++ nyelv ms nyelvekhez hasonlan rendelkezik avezrlstads goto utastsval, melynek hasznlata nehezen kvethetv teszi a program szvegt. Ezenutasts hasznlata azonban az esetek tbbsgben elkerlhet a break s a continue utastsokbevezetsvel. A C++ nyelv utastsait ht csoportba sorolhatjuk:

    Kifejezs utastsres utasts: ;sszetett utasts: { }, try {}Szelekcis utastsok: if, else, switchCmkzett utastsok: case, default, ugrsi cmkeVezrlstad utastsok: break, continue, goto, return,

    throwItercis (ciklus) utastsok: do, for, while

    Az utastsok rszletes trgyalsnl nem a fenti csoportostst kvetjk, hiszen az egyes utastsokhasznlatakor klnbz csoportokban elhelyezked utastsokat kell alkalmaznunk.

    1.6.1. Utastsok s blokkok

    Tetszleges kifejezs utasts lesz, ha pontosvesszt (;) helyeznk mg:kifejezs;

    A kifejezs utasts vgrehajtsa a kifejezsnek az 1.5. fejezetben ismertetett szablyok szerint trtnkirtkelst jelenti. Mieltt a kvetkez utastsra kerlne a vezrls, a teljes kirtkels (amellkhatsokkal egytt) vgbemegy. Nzznk nhny kifejezs utastst:

    x = y + 3; // rtkadsx++; // az x nvelse 1-gyelx = y = 0; // tbbszrs rtkadsfv(arg1, arg2); // void fggvny hvsay = z = f(x) +3; // fggvnyt hv kifejezs

    Az res utasts egyetlen pontosvesszbl ll:;

    Az res utasts hasznlatra akkor van szksg, amikor logikailag nem kvnunk semmilyen tevkenysgetvgrehajtani, azonban a szintaktikai szablyok szerint a program adott pontjn utastsnak kell szerepelnie.Az res utastst, melynek vgrehajtsakor semmi sem trtnik, gyakran hasznljuk a do, for, while s ifszerkezetekben.

    A kapcsos zrjeleket ( { s } ) hasznljuk arra, hogy a logikailag sszefgg deklarcikat s utastsokategyetlen sszetett utastsba vagy blokkba csoportostsuk. Az sszetett utasts mindentt felhasznlhat,ahol egyetlen utasts megadst engedlyezi a C++ nyelv lersa. sszetett utastst, melynek ltalnosformja:

    { loklis defincik s deklarcik utastsok}

    a kvetkez hrom esetben hasznlunk:

  • 39

    1. Amikor tbb logikailag sszefgg utastst egyetlen utastsknt kell kezelni (ilyenkor ltalban csakutastsokat tartalmaz a blokk),

    2. Fggvnyek trzseknt,3. Defincik s deklarcik rvnyessgnek lokalizlsra.

    Az utastsblokkon bell az utastsokat s a defincikat/deklarcikat tetszleges sorrendben megadhatjuk.Felhvjuk a figyelmet arra, hogy blokkot nem kell pontosvesszvel lezrni.

    1.6.2. Az if utasts

    A C++ nyelv kt lehetsget biztost a program kdjnak felttelhez kttt vgrehajtsra - az if s a switchutastsokat. Az if utasts segtsgvel valamely tevkenysg (utasts) vgrehajtst egy kifejezs (felttel)rtktl tehetjk fggv. Az if albbi formjban az utasts csak akkor hajtdik vgre, ha a kifejezsrtke nem nulla (igaz, true):

    if (kifejezs) utasts

    A kvetkez pldaprogram egyetlen karaktert olvas a billentyzetrl Enterrel lezrva, ha a karakter azescape () karakter, akkor kilps eltt hangjelzst ad. Ha nem az billentyt nyomjuk le, aprogram egyszeren befejezi a futst.

    #include using namespace std;#define ESC 27

    void main(void){ char ch; cout

  • 40

    1.6.2.1. Az if-else szerkezet

    Az if utasts teljes formjban, amely tartalmazza az else-gat, arra az esetre is megadhatunk egytevkenysget (utasts2), amikor a kifejezs (felttel) rtke zrus (hamis, false). Ha az utasts1 s azutasts2 nem sszetett utastsok, akkor pontosvesszvel kell ket lezrni.

    if (kifejezs) utasts1else utasts2

    Az if-else konstrukci logikai vzlata a kvetkez brn lthat.

    hamis gkifejezs==0

    utasts2

    igaz gkifejezs!=0

    utasts1

    ifkifejezs

    Az albbi pldban a beolvasott egsz szmrl if utasts segtsgvel dntjk el, hogy az pros vagypratlan:

    #include using namespace std;

    void main(){ coutn; if (n % 2 == 0) cout

  • 41

    A msik jrhat t, ha a bels if utastst kapcsos zrjelek kz, azaz utasts blokkba helyezzk:if (n < 0) { if (n % 2 == 0) cout

  • 42

    else { // hibs mvelet! cerr

  • 43

    A return utastssal, mind a switch utastsbl, mind pedig a main() fggvnybl kilpnk. ltalban adefault cmke utni utastsokat is break-kel zrjuk, azon egyszer oknl fogva, hogy a default brholelhelyezkedhet a switch utastson bell.

    Akvetkez pldban azt mutatjuk be, hogyan lehet tbb esethez ugyanazt a programrszletet rendelni. Aprogramban a vlaszknt beolvasott karaktert feldolgoz switch utastsban az 'i' s 'I', illetve az 'n' s 'N'esetekhez tartoz case cmkket egyms utn helyeztk el.

    #include using namespace std;

    void main(){ cout

  • 44

    A ciklusokbl a vezrlfelttel hamis rtknek bekvetkezte eltt is ki lehet ugrani (a vgtelen ciklusblis). Erre a clra tovbbi utastsokat biztost a C++ nyelv, mint a break, a return, illetve a ciklus trzsnkvlre irnyul goto. A ciklus trzsnek biznyos utastsait tugorhatjuk a continue utasts felhaszn-lsval. A continue hatsra a ciklus kvetkez itercijval folytatdik a program futsa.

    1.6.4.1. A while ciklus

    A while ciklus mindaddig ismtli a hozz tartoz utastst (a ciklus trzst), amg a vizsglt kifejezs(vezrlfelttel) rtke igaz (nem nulla). A vizsglat mindig megelzi az utasts vgrehajtst. A while jlolvashat alakja:

    while (kifejezs) utasts

    A while ciklus mkdsnek folyamata az albbi brn kvethet nyomon.

    whilekifejezs

    hamis gkifejezs==0

    igaz gkifejezs!=0

    utasts

    a ciklusutni

    utasts

    A kvetkez pldaprogramban meghatrozzuk az els n egsz szm sszegt:#include using namespace std;

    void main(){ long sum; int n = 2001;

    cout

  • 45

    utasts

    A for utasts valjban a while utasts specilis alkalmazsa, gy a fenti for ciklus minden tovbbi nlkltrhat while cikluss:

    init_kif;while (felttel_kif) { utasts lptet_kif;}

    A for ciklus mkdsi vzlatt az albbi bra tartalmazza:

    igaz gkifejezs!=0

    whilekifejezs

    hamis gkifejezs==0

    utasts

    a ciklusutni

    utasts

    inicializlkifejezs

    lptetkifejezs

    Megjegyezzk azonban, hogy a while s a for ciklusok eltren viselkednek, ha a ciklus trzsben a ksbbismertetsre kerl continue utastst hasznljuk.. Az brn jl nyomonkvethetk a for ciklus vgrehajt-snak lpsei:1. Megtrtnik az init_kif kifejezs (amennyiben megadtuk) kirtkelse, melynek sorn a ciklusban hasznlt

    vltozkat inicializljuk. Semmilyen megkts nincs az init_kif tpusra vonatkozan.

    2. A kvetkez lpsben a felttel_kif (aritmetikai vagy mutat tpus) kifejezst dolgozza fel a rendszer (hamegadtuk). A felttel_kif fggvnyben a ciklus az albbi hrom eset valamelyiknek megfelelen mkdhet: Ha a felttel_kif rtke igaz (nem nulla), akkor vgrehajtdik az utasts melyet a lptet_kif kifejezs

    kirtkelse kvet. Minden tovbbi itercit a felttel_kif kirtkelse nyit meg, s a lptet_kif kirtkelsezr.

    Ha a felttel_kif nincs megadva, akkor annak rtkt igaznak ttelezi fel a rendszer s a ciklus futsa pontosanmegegyezik az elz esetnl trgyalttal. Ebben az esetben a ciklus lelltsa csak a break, a return vagy agoto utastsok segtsgvel oldhat meg.

    Ha a felttel_kif rtke hamis (0), akkor a for utasts befejezi mkdst s a vezrls a program kvetkezutastsra kerl.

  • 46

    Pldaknt a for ciklusra, rjuk t a while ciklussal megoldott, egsz szmok sszegt meghatrozprogramot!. Azonnal lthat, hogy a megoldsnak ez a vltozata sokkal ttekinthetbb s egyszerbb:

    #include using namespace std;

    void main(){ long sum; int i, n = 2001;

    cout

  • 47

    whilekifejezs

    hamis gkifejezs==0

    igaz gkifejezs!=0

    utasts

    a ciklusutni

    utasts

    Els pldaknt az egsz szmokat sszegz programnak rjuk meg a do-while ciklust hasznl vltozatt.Gyakorlatilag semmit sem kell megvltoztatnunk, a ciklus tszervezsn kvl:

    #include using namespace std;

    void main(){ long sum; int n = 2001;

    cout

  • 48

    #include using namespace std;

    void main(){ int n=2001; while (n>0) { if (!(n % 123)) break; n--; } if (n) cout

  • 49

    1.6.6. A goto utasts

    A strukturlt, jl ttekinthet (teht valsznleg hibtlan) programszerkezet kialaktsa sorn nem szabadgoto utastst hasznlnunk. A goto utasts ugyanis kuszv, ttekinthetetlenn teszi a forrsprogramot.Vannak esetek azonban, amikor a goto segtsgvel jutunk el legegyszerbben a megoldshoz.

    A goto utasts felhasznlshoz utastscmkvel kell megjellnnk azt az utastst, ahova ksbb ugraniszeretnnk. Az utastscmke valjban egy azonost, amelyet kettsponttal hatrolunk el az utna llutaststl:

    azonost: utasts

    A goto utasts, amellyel a fenti cmkvel megjellt sorra adhatjuk a vezrlst:

    goto azonost;

    Szksges megjegyeznnk, hogy a goto utastsnak s a clcmknek egyazon fggvnyen bell kellelhelyezkednie.

    Nzznk egy olyan pldt, ahol a goto hasznlata nlkl igen bonyolult programszerkezet ll el. A feladataz, hogy kt egymsba gyazott ciklusbl lpjnk ki, ha egy bizonyos felttel bekvetkezik. Az egyszervltozatban a goto utastst hasznljuk:

    for ( ... ) { for ( ... ) { if ( ... ) goto stop; . . .

    }}stop: cout

  • 50

    A C++ nyelv a kivtelek kezelst a megszaktsos (termination) modell alapjn vgzi. Ez azt jelenti, hogy akivtelt kivlt programrszlet (fggvny) futsa megszakad az esemny bekvetkeztekor. A kivtelkezelstltalban hibakezels, illetve hibatr (fault-tolerant) programok kialaktsakor alkalmazzuk.

    A C++ nyelv tpusorientlt kivtelkezelsei lehetsgeit az albbi hrom elem jellemzi: kivtelkezels alatt ll programrszlet kijellse (try-blokk), a kivtelek tovbbtsa (throw), a kivtelek "elfogsa" s kezelse (catch).

    A kivtelkezelst teht a programunk adott rszn bell loklisan kell kialaktanunk a try, a throw s acatch kulcsszavak felhasznlsval. A kivtelkezels csak a try-blokknak (prblkozs-blokknak) nevezettutastsban megadott (illetve az abbl hvott) kd vgrehajtsa esetn fejti ki hatst. A kijellt kdrszletenbell a throw utastssal

    throw kifejezs;

    adhatjuk t a vezrlst a kifejezs tpusnak megfelel kezelnek (handler), amelyet a catch kulcsszt kve-ten adunk meg.

    try /