Az Ansi C++ tarnkönyve Szerző: Tóth Bertalan ComputerBooks Kiadó, 2003 május 332 oldal, - CD melléklettel ISBN: 963 618 301 5
A könyv előszava
Gondolatok a könyvről A "Programozzunk C++ nyelven!" című könyv elsősorban azok számára íródott, akik most kezdenek ismerkedni napjaink programozási nyelveinek alapját képező C++ nyelvvel. Nem szükséges a teljes művet elolvasni ahhoz, hogy a feldolgozott témakört programok írásával mélyítse el az Olvasó. Amennyiben a feldolgozást sikeresnek ítéli meg, továbbléphet a következő fejezetre. Az önellenőrzéshez a CD-mellékleten található C++ fejlesztőeszköz, tesztprogram és feladatok nyújtanak segítséget. A könyv azok számára is értékes szakirodalom lehet, akik ugyan már programokat írnak C++ nyelven, azonban a C++ nyelvnek még nem minden területén mozognak otthonosan. A fejezetek a címükben szereplő témakört teljes részletességgel és példák sokaságával tárják az Olvasó elé.
A könyv felépítése A könyv felépítése olyan, hogy folyamatosan olvasva meg lehet ismerkedni a C++ nyelvvel, valamint a legfontosabb könyvtári függvényekkel és osztályokkal. A C++ nyelv múltja, jelene és lehetséges jövőjének bemutatása után a könyv további fejezeteit három részre osztjuk. Az első "A C++ mint egy jobb C nyelv" rész a C++ nyelv hagyományos programozást támogató lehetőségeit tárja az Olvasó elé. Ezek az ismeretek elsősorban a nem objektum-orientált programkészítés során hasznosíthatók. A második "Az objektum-orientált C++ nyelv" című rész hat fejezeten keresztül az objektum-orientált programkészítés alapjaival ismerteti meg az Olvasót. A tárgyalás során a részletekben való elmélyülés helyett egy világos áttekintést adunk a témakörrel kapcsolatos fogalmakról és megoldásokról. A harmadik rész valójában a könyv függeléke, azonban ennek ellenére egy sor hasznos információt tartalmaz a C++ nyelv könyvtári függvényeiről és osztályairól. Többek között bemutatjuk az adatbevitel és adatkivitel hagyományos és objektumos megoldásait, a karaktersorozatok kezelésének eszközeit, valamint a szabványos sablonkönyvtár (Standard Template Library) összetevőit.
Mit található a CD-mellékleten? A könyvhöz csatolt CD-melléklet azon túl, hogy megkíméli az Olvasót a példák unalmas begépelésétől, a kitűzött feladatok megoldását is tartalmazza. Ugyancsak megtalálható itt egy tesztprogram és a Dev-C++ 5.0 beta 7 (4.9.7.0) ingyenes C++ fejlesztőeszköz. A Dev-C++ szabad szoftver, amelyet a GNU General Public License alapján lehet terjeszteni. (Ez azt jelenti, hogy szabadon továbbadható és módosítható.)
Mitől más ez a könyv? Könyvünk megírását évtizedes C/C++ oktatási gyakorlat előzte meg a Budapesti Műszaki Egyetem Gépészmérnöki Karán és Mérnöktovábbképző Intézetében. Ennek során szerzett tapasztalatok nagyban hozzájárultak könyvünk szerkezetének és tartalmának kialakításához. Ezúton is köszönetet szeretnénk mondani annak a több száz hallgatónak, akik közvetve ugyan, de hozzájárultak könyvünk megjelenéséhez.
Gondolatok a C++ nyelvről A C++ hatékony, általános célú programozási nyelv. Segítségévek kis alkalmazások és nagy programok egyaránt előállíthatók. A C++ hagyományos fejlesztőeszközként és objektum-orientált programozási nyelvként egyaránt használható.
A múlt A C nyelv alapelemeinek többsége a Martin Richards által kifejlesztett BCPL (Basic Combined Programming Language, 1963) nyelvből származik. Ez a származtatás közvetett módon - a B nyelven keresztül - ment végbe. A B nyelvet Ken Thompson dolgozta ki 1970-ben az AT&T Bell Laboratóriumok cégnél, és ezen a nyelven készült el az első UNIX operációs rendszer DEC PDP-7 számítógépre. A B nyelv azonban nem bizonyult elég hatékonynak az új PDP-11 számítógép UNIX operációs rendszerének megírására. Mivel azonban a magas szintű nyelven történő implementációról nem akartak lemondani, Dennis Ritchie 1971-ben hozzálátott a B nyelv új változatának kidolgozásához, amit C-nek neveztek el. A felmerült problémák kiküszöbölésén kívül, Ritchie igyekezett a C nyelvbe visszahozni azokat az általános programozási elemeket, amelyek az Algol-60 nyelv "karcsúsítása" során kikerültek a BCPL és B nyelvekből. Több éven át csak az AT&T UNIX operációs rendszerrel szállított C-fordító képviselte a C nyelv definícióját. Az 1978-ban megjelent, B.W. Kernigham és D. M. Ritchie által írt "The C Programming Language" című könyv szolgált a nem UNIX-alapú C-implementációk kiindulópontjául. A C nyelv világméretű elterjedése összefügg a mikroszámítógépek megjelenésével. Bár ebben az időben még nem volt szabványa a C nyelvnek, azonban a K&R könyvben leírt függvények használatával lehetett olyan programot írni, amely a különböző mikro- és miniszámítógépeken lefordítva ugyanúgy futott. Megjelent az igény a szabványos C nyelv megalkotására, amely a gombamód szaporodó fordítók és gépek között biztosíthatja a C nyelvű forrásprogramok hordozhatóságát (portabilitását). A C nyelvet több lépésben szabványosították. Az első (ANSI) szabvány 1983-ban jelent meg, így alapul szolgálhatott a C++ nyelv megformálásához. A ANSI C szabvány végleges változata (ANSI X3.159-1989) hat évi munka után, 1989-ben készült el. A C szabványt 1989-ben revízió alá vették (IOS/IEC), majd 1995-ben kibővítették a széles karakterek (wchar_t) használatának lehetőségével. A C nyelv történetét itt le is zárhatnánk, napjainkban újabb C-fordítók már nem születnek.
A jelen A C nyelv helyét, szerepét világszerte a C++ nyelv veszi át, melynek kifejlesztése az AT&T Bell Laboratóriumoknál dolgozó Bjarne Stroustrop nevéhez fűződik. Mint ahogy ismeretes, a C nyelvet szintén itt fejlesztették ki a 70-es évek elején. Így nem csoda, hogy a tíz évvel későbbi C++ fejlesztés a C nyelvre épült. A C nyelv ismerete ezért teljesen természetes kiindulópont a C++ nyelv megismeréséhez. Bjarne Stroustrop két fő szempontot tartott szem előtt a C++ kidolgozásánál: 1. A C++ nyelv legyen felülről kompatibilis az eredeti C nyelvvel. 2. A C++ nyelv bővítse ki a C nyelvet a Simula 67 nyelvben használt osztályszerkezettel (class). Az osztályszerkezet, amely a C nyelv struct adatszerkezetére épült, lehetővé tette az objektum-orientált programozás (OOP) megvalósítását. A C++ nyelv több szakaszban nyerte el mai formáját. A C++ Version 1.2 változata terjedt el először a világon (1985). A használata során felvetődött problémák és igények figyelembevételével Bjarne Stroustrop kidolgozta a Version 2.0 nyelvdefiníciót (1988). A jelentős változtatások miatt a régi C++ (1.2) nyelven írt programok általában csak kisebb-nagyobb javítások után fordíthatók le a 2.0-ás verziót megvalósító fordítóprogrammal. Az évek folyamán a C++ nyelv újabb definíciói (3.x) jelentek meg, azonban a lényeges újdonságok két nagy csoportba sorolhatók: " kivételek (exception) kezelése, " paraméterezett típusok, osztályok és függvények használata (templates, sablonok). A C++ szabvány kidolgozásában az ANSI X3J16 és az ISO WG21 bizottságok vettek részt a 90-es évek első felében. Munkájuk eredményeként 1997 novemberében megszületett az ANSI/ISO C++ szabvány, melyre a napjainkban használt legtöbb C++ fordítóprogram épül. Mielőtt elkezdenénk a szabványos C++ nyelv elemeinek bemutatását, le kell szögeznünk, hogy a C++ nyelv a C nyelv szintakszisára épülő önálló programozási nyelv. Alapvető eltérés a két nyelv között, hogy amíg a C nem típusos nyelv, addig a C++ erősen típusos, objektum-orientált nyelv. A C programok többsége minden további nélkül átvihető C++ rendszerbe. Mivel a C++ nyelv "erősen típusos nyelv", a szükséges módosításokat általában a konverziók és a deklarációk területén kell elvégezni.
(Egy lehetséges) jövő Napjainkban egyre több olyan programozási nyelv születik, melyek gyökere a C/C++ nyelvekből ered. Ilyen szemszögből tekintve elmondhatjuk, hogy a C++ nyelv átvette az Algol nyelvtől azt a szerepet, hogy más nyelvek is merítenek belőle. A jövőben a C++ elsősorban a helyi (kliens) fejlesztések eszköze lesz, míg más területeken az újabb nyelvek hódítanak. Külön is érdemes kiemelni a hálózatos (Internetes) megoldásokhoz használt eszközök közül a Sun cég által támogatott Java nyelvet, és Microsoft hasonló célú fejlesztőeszközét, a C# (C sharp) nyelvet.
A könyv tartalomjegyzéke
Bevezetés A C++, MINT EGY JOBB C NYELV 1. Első találkozás C++ nyelven írt programmal 2. A C++ nyelv alapelemei 2.1. A nyelv jelkészlete 2.2. A C++ nyelv azonosítói 2.3. Konstansok 2.3.1. Egész konstansok 2.3.2. Karakter-konstansok 2.3.3. Lebegőpontos konstansok 2.4. Sztringkonstansok (literálok) 2.5. Megjegyzések a programban 2.6. Operátorok és írásjelek 3. A C++ program szerkezete 3.1. Egyetlen modulból felépülő C++ program 3.2. Több modulból álló C++ program 4. Alaptípusok, változók és konstansok 4.1. A C++ nyelv típusai 4.1.1. Típuselőírások, típusmódosítók 4.1.2. Típusminősítők 4.1.3. A felsorolt típus (enum) 4.2. Egyszerű változók definiálása 4.3. Saját típusok előállítása 4.5. Konstansok a C++ nyelvben 4.6. Értékek, címek, mutatók és referenciák 4.6.1. Balérték és jobbérték 4.6.2. Ismerkedés a mutatóval és a referenciával 5. Operátorok és kifejezések 5.1. Precedencia és asszociativitás 5.1.1. Az elsőbbségi (precedencia) szabály 5.1.2. A csoportosítási (asszociativitás) szabály 5.2. Mellékhatások és a rövidzár kiértékelés 5.3. Az elsődleges kifejezés operátorai 5.4. Aritmetikai operátorok 5.5. Összehasonlító és logikai operátorok 5.6. Léptető operátorok 5.7. Bitműveletek 5.7.1. Bitenkénti logikai műveletek 5.7.2. Biteltoló műveletek 5.8. Értékadó operátorok 5.9. Pointerműveletek 5.10. A sizeof operátor 5.11. A vessző operátor 5.12. A feltételes operátor 5.13. Az érvényességi kör (hatókör) operátor 5.14. A new és a delete operátorok használata 5.15. Futásidejű típusazonosítás 5.16. Típuskonverziók 5.16.1. Implicit típuskonverziók 5.16.2. Explicit típusátalakítások 5.17. Bővebben a konstansokról 6. A C++ nyelv utasításai 6.1. Utasítások és blokkok 6.2. Az if utasítás 6.2.1. Az if-else szerkezet 6.2.2. Az else-if szerkezet 6.3. A switch utasítás 6.4. A ciklusutasítások 6.4.1. A while ciklus 6.4.2. A for ciklus 6.4.3. A do-while ciklus 6.5. A break és a continue utasítások 6.5.1. A break utasítás 6.5.2. A continue utasítás 6.6. A goto utasítás 6.7. A return utasítás 6.8. Kivételek kezelése 6.9. Definíciók bevitele az utasításokba 7. Származtatott adattípusok 7.1. Tömbök, sztringek és mutatók 7.1.1. Egydimenziós tömbök 7.1.2. Mutatók és a tömbök 7.1.3. Karaktersorozatok (sztringek) 7.1.4. Többdimenziós tömbök 7.1.5. Mutatótömbök, sztringtömbök 7.1.6. Dinamikus helyfoglalású tömbök 7.2. Felhasználó által definiált adattípusok 7.2.1. A struct struktúratípus 7.2.2. A class osztálytípus 7.2.3. A union típusú adatstruktúrák 7.2.4. A bitmezők alkalmazása 7.2.5. Esettanulmány: önhivatkozó struktúrák használata - listaszerkezet 8. Függvények 8.1. Függvények definíciója és deklarációja 8.2. A függvények paraméterezése és a függvényérték 8.3. A függvényhívás 8.4. Különböző típusú paraméterek használata 8.4.1. Aritmetikai típusú paraméterek 8.4.2. Felhasználói típusú paraméterek 8.4.3. Tömbök átadása függvénynek 8.4.4. Sztringargumentumok 8.4.5. A függvény, mint argumentum 8.4.6. Alapértelmezés szerinti (default) argumentumok 8.4.7. Változó hosszúságú argumentumlista 8.4.8. A main() függvény paraméterei és visszatérési értéke 8.5. Rekurzív függvények használata 8.5.1. A rekurzív függvények csoportosítása 8.6. Inline függvények 8.7. Függvénynevek átdefiniálása (overloading) 8.8. Általánosított függvények (template) 8.9. Típusmegőrző szerkesztés (type-safe linking) 8.10. Esettanulmány: C++ deklarációk értelmezése és készítése 8.10.1. C++ deklarációk értelmezése 8.10.2. C++ deklarációk készítése 9. Névterek és tárolási osztályok 9.1. Az azonosítók élettartama 9.2. Érvényességi tartomány és a láthatóság 9.3. A kapcsolódás 9.4. Névterületek 9.4.1. Saját névterületek kialakítása és használata 9.5. A tárolási osztályok használata 9.5.1. Az auto tárolási osztály 9.5.2. Az extern tárolási osztály 9.5.3. A static tárolási osztály 9.5.4. A register tárolási osztály 10. Az előfeldolgozó (preprocesszor) 10.1. Állományok beépítése a forrásprogramba 10.2. Feltételes fordítás 10.3. Makrók használata 10.3.1. Szimbolikus konstans makrók készítése 10.3.2. Függvényszerű makrók készítése 10.3.3. Előre definiált makrók 10.4. A #line, az #error és a #pragma direktívák AZ OBJEKTUM-ORIENTÁLT C++NYELV
11. Bevezetés az objektum-orientált C++ nyelvbe 12. Osztályok 12.1. Adattagok 12.2. Tagfüggvények 12.2.1. Konstans tagfüggvények és a mutable típusminősítő 12.3. Az osztály tagjainak elérése 12.4. Az osztályok friend mechanizmusa 12.5. Az osztály objektumai 12.6. Statikus osztálytagok használata 12.7. Osztálytagra mutató pointerek 13. Konstruktorok és destruktorok 13.1. Konstruktorok 13.1.1. A konstruktorok explicit paraméterezése 13.2. Tagobjektumok inicializálása 13.3. Konstans tagok inicializálása 13.4. Destruktor 14. Operátorok túlterhelése (operator overloading) 14.1. A léptető (++,--) operátorok túlterhelése 14.2. Az értékadó operátor átdefiniálása 14.3. Függvényszerű osztályok (functionoidok) készítése 14.4. Felhasználó által definiált típuskonverzió 14.5. Az osztályok bővítése input/output műveletekkel 14.6. A new és a delete operátorok túlterhelése 14.7. A C++ nyelv bővítése saját típussal 15. Az öröklés (öröklődés) mechanizmusa 15.1. A származtatott osztályok 15.2. Az alaposztály inicializálása 15.3. Virtuális tagfüggvények - többalakuság (polimorfizmus) 15.3.1. A virtuális függvények újradefiniálása (redefine) 15.3.2. Virtuális destruktorok 15.4. Virtuális alaposztályok 15.5. Futás közbeni típusinformációk (RTTI) osztályok esetén 15.6. Kivételek és osztályok 16. Általánosított osztályok (templates) 16.1. Általánosított osztály definiálása 16.2. Specializáció és példányosítás 16.3. A sablonosztály "barátai" és statikus adattagjai 16.4. Érték- és alapértelmezett sablonparaméterek 16.5. A typename kulcsszó 16.6. Összetettebb sablonpélda A C++NYELV KÖNYVTÁRA
F1. A szabványos C++ nyelv könyvtárainak áttekintése F2. Adatok bevitele és kivitele F2.1. A C-könyvtár alapvető I/O műveletei (cstdio) F2.1.1. Karakterek kiírása és beolvasása F2.1.2. Karaktersorozatok kiírása és beolvasása F2.1.3. Formázott adatbevitel és -kivitel F2.1.4. Írás sztringbe és olvasás sztringből F2.1.5. Az stdio és stdout adatfolyamok átirányítása F2.2. A C++ alapvető I/O műveletei (iostream) F2.2.1. Az műveletek F2.2.2. I/O manipulátorok használata F2.2.3. I/O manipulátorok készítése F2.2.4. Írás sztringbe és olvasás sztringből F2.3. Állományok kezelése F2.3.1. Állománytípusok F2.3.2. Szabványos C/C++ fájlkezelés F2.3.3. A szabványos C++ állománykezelés F3. A C-könyvtár legfontosabb elemei F3.1. Karakterek osztályozása és átalakítása F3.2. Konverziós függvények F3.3. Memória-területek (pufferek) kezelése F3.4. A dinamikus memória-kezelés függvényei F3.5. Matematikai függvények F3.6. Dátum- és időkezelő függvények F3.7. Rendezés és keresés F3.8. Egyéb hasznos függvények F4. A Szabványos Sablonkönyvtár (STL) elemei F4.1. Tárolók (konténerek) F4.2. Iterátorok F4.3. Algoritmusok F4.4. Művelet-objektumok (functions) F4.5. Allokátorok (allocators) F5. Karaktersorozatok kezelése F5.1. A C-könyvtár függvényei F5.2. A string osztály használata Irodalomjegyzék Tárgymutató
|