C++ alapok
Első program¶
Ahhoz, hogy tudjunk fordítani, szükségünk lesz egy fordítandó forráskódra is. Mivel még nem tudunk C++-ban programozni, nyugodtan írhatunk egy C nyelvű programot is, mentsük el elso.cpp néven (a .cpp kiterjesztés fontos).
1 2 3 4 5 6 | |
Fordítás¶
Ha már eddig kész vagyunk, a Programozás alapjairól már ismert módon fordíthatjuk a programunkat, annyi különbséggel, hogy az eddigi gcc parancs helyett g++ parancsot kell használnunk.
g++ -o elso -Wall elso.cpp
Ismétlés a kapcsolókról:
-okapcsolóval adhatjuk meg a kimeneti fájl nevét-Wallkapcsolóval további fordítóprogram figyelmeztetést (warningot) kapcsolhatunk be- Ilyen például az, hogy egy
booleanértéket egy nemboolean-nek megfelelő egésszel hasonlítunk össze - vagy mondjuk a kiírt, de üresen hagyott
if/elseblokkokról is kaphatunk warningot. elso.cppa fordítandó forrás fájl neve
A lefordított, linkelt alkalmazást ezután már futtathatjuk elso.exe vagy ./elso utasítással.
A fordító -o paraméter nélkül a.exe vagy a.out nevű futtatható állományt készít.
Fordítás fázisai¶
Ugyanaz, mint C esetében (lásd Programozás Alapjai jegyzet).
Hello Világ C++-ban¶
A megszokott, jól ismert C programunkat átalakíthatjuk úgy, hogy a C++-ban használatos kiíratás szerepeljen benne.
1 2 3 4 5 6 | |
Hogy ne kelljen mindenhova kiírni az std:: előtagot, a program elejére beírhatjuk a using namespace std; sort. (Ennek a jelentéséről majd később beszélünk.)
1 2 3 4 5 6 7 8 | |
A felkommentelt fájl letöltése
C++ input/output¶
A hagyományos C-ben megtanult beolvasás és kiíratás is működik C++-ban.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
C++-ban az input/output műveletek streamek (folyamok) segítségével vannak megvalósítva
- cout: az alapértelmezett kimenet
- cerr: az alapértelmezett hibakimenet
- cin: az alapértelmezett bemenet
A streamekbe (folyamokba) a << operátor segítségével írhatunk, és a >> operátor segítségével olvashatunk belőlük.
Ezek használatához a C-ben megszokott stdio.h header fájl helyett a C++-ban használatos iostream header fájlt kell include-olni. Ezzel az új, stream-eken alapuló műveleteket adjuk hozzá programunkhoz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
Sorvéget az endl segítségével írhatunk.
C++ string¶
Mi történik az alábbi programmal akkor, ha a fix méretű karakter tömbbe hosszabb méretű karakterláncot adunk meg?
1 2 3 4 5 6 7 8 9 10 11 | |
Az eredmény (ha a program lefut):
1 2 | |
Azonban ha túl hosszú a bemenet, akkor a program hibával megállhat. A megoldás az, hogy az inputnak megfelelő méretű területet foglalunk, és oda írjuk be a felhasználó által megadott nevet. A C++-ban a "szövegeknek" van egy hatékonyabb, kevésbé körülményes megvalósítása is, a string osztály (osztályokról később lesz szó, most csak azt mutatjuk be, hogyan lehet használni a string-et). A string objektumok dinamikusan változtatják a méretüket a tartalmazott karakterek számától függően. A félév folyamán stringek alatt ezt a reprezentációt értjük, nem pedig a char*-ot.
A string objektumok használatához, string műveletekhez szükségünk lesz a string header include-olására is (és nem string.h). Ezt követően kényelmesen használhatjuk a szövegeket, ahogy már Javaban is megszoktuk. Itt csak a fontosabb használati eseteket emeljük ki, bővebb leírásokhoz linkek:
- http://www.cplusplus.com/reference/string/string/
- https://en.cppreference.com/w/cpp/string/basic_string
A string osztály fontosabb metódusai, amelyeket a leggyakrabban használunk:
Létrehozás, azaz a konstruktorok¶
1 2 3 4 | |
Beolvasás, kiírás¶
1 2 3 | |
A scanf nem használható a string beolvasására, de a cin segítségével be tudjuk olvasni, és a cout segítségével ki tudjuk írni.
Összehasonlítás¶
1 2 3 4 5 6 | |
A string-eket az == operátor segítéségével össze lehet hasonlítani.
Összefűzés¶
1 2 3 4 | |
Méret, üres-e, tartalom törlése¶
1 2 3 4 5 6 7 8 | |
i-edik elem¶
1 2 3 4 5 | |
Ha olyan indexre hivatkozunk, amelyik érvénytelen, azaz a string hosszánál nagyobb, akkor nem definiált viselkedés lesz az eredménye.
Konverzió szám és string között¶
Számból string-gé a to_string segítségével konvertálhatunk.
1 2 3 4 | |
string-et számmá konvertálni az stoi függvénnyel lehet.
1 2 3 | |
Konverziók a különböző típusokra:
int: stoilong: stollong long: stollunsigned long: stoulunsigned long long: stoullfloat: stofdouble: stodlong double: stold
Mi történik,
- ha a szöveg elején van szám, de van mögötte ,,egyéb'', akkor a számot átkonvertálja
1 2 | |
- ha nem fér bele a tartományba, akkor
std::out_of_rangekivétel dobódik (kivételkezelés, const és referencia később)
1 2 3 4 5 6 7 | |
- ha nem lehet konvertálni, akkor
std::invalid_argumentkivétel dobódik
1 2 3 4 5 6 7 | |
Hibakeresés¶
Debugger használata¶
Az IDE eszközök általában tartalmaznak debuggert is, ami lehetővé teszi, hogy a program végrehajtását utasításról utasításra lépve kövessük végig úgy, hogy közben a változók állapotát, értékét folyamatosan monitorozni tudjuk. Fontos, hogy ahhoz, hogy a debugger megfelelően tudjon működni, a kódot úgy kell fordítani, hogy abba belekerüljenek a debugger számára szükséges információk, illetve a kódot ne optimalizálja a fordító, amellyel esetlegesen kihagy belőle utasításokat, amely miatt egy kicsit nehezebben követhető lehet, hogy a program miért úgy fut, ahogy.
Assertek¶
C++-ban lehetőség van a assert preprocesszor makró által arra, hogy bizonyos feltételeket ellenőrizzünk a program futtatása során, amelyek ha nem teljesülnek, a program végrehajtása megszakad. Ennek használatához importálnunk kell a cassert headert.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Kiiratás¶
Sok esetben persze a legegyszerűbb és leggyorsabb megoldás, ha a programunkban kiirató utasításokat használunk egy-egy változó értékének lekérésére és ellenőrzésére. Annak érdekében, hogy ne vesszünk el esetlegesen a sok kiíratásban, illetve adott esetben ezeket a saját debugolásra használt üzeneteket könnyen ki tudjuk kapcsolni, érdemes a feltételes fordítás lehetőségét alkalmaznunk, illetve a megfelelő makrókkal jelezhetjük azt is, hogy az adott kiiratás a kódunk melyik részén történt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
A #define DEBUG sor hozzáadásával, vagy a -DDEBUG fordítási kapcsolóval tudjuk elérni, hogy a programba bekerüljün a megfelelő kiirató utasítás futtatása. Ezek elhagyásával a program a kiiratás nélkül fut le.
Létrehozva: 2024-06-20