ProgramozásC++ típusok, operátorok
Fodor Attila
Pannon EgyetemMűszaki Informatikai Kar
Villamosmérnöki és Információs Rendszerek Tanszék
2010. március 4.
C++ típusok C++ nyelvben használható típusok, változók, aritmetika
Deklaráció és definíció
DeklarációMinden névről meg kell mondani mire szeretnénk használni, mert enneka hiányában a fordító nem tud mit kezdeni az adott névvelA tulajdonságai a következők: típus, tárolási osztály, láthatóságNem történik memória foglalás
DefinícióHa az a cél, hogy a deklarációnak megfelelő objektum is létrejöjjön amemóriában akkor DEFINÍCIÓT kell alkalmazni.A DEFINÍCIÓ olyan DEKLARÁCIÓ, amely helyfoglalással jár.
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 2 / 43
C++ típusok C++ nyelvben használható típusok, változók, aritmetika
A C++ nyelv típusai
Skalár (egyszerű típus)Aritmetikai típusok
Egész jellegű típusokcharintenumLebegőpontos típusokfloatdouble
Mutató típusokReferencia típusvoid
Összetett típusÖsszeállított típusok
Tömb típusokStructúra (struct) típusok
Unió (union) típusok
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 3 / 43
C++ típusok C++ nyelvben használható típusok, változók, aritmetika
Alaptípusok, Típusmódosítók, Típusminősítők, Típuselőírás
Alaptípusokcharintfloatdoubleenumstructunionvoid (típusnév hiánya; üres típus)
Típusmódosítókshort (a tárolási hosszat szabályozza)long (a tárolási hosszat szabályozza)signed (előjeles)unsigned (előjel nélküli)
Típusminősítők: const (olyan objektum definiálható, amely nemváltozatható meg (olvasható objektum))Típuselőírás: (alaptípus, típusmódosítók, típusminősítők)
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 4 / 43
C++ típusok C++ nyelvben használható típusok, változók, aritmetika
Változók mérete (sizeof operátor)
sizeof kifejezéssizeof(típus)sizeof(char) ⇒ 1 byte (8 bit)sizeof(short) ≥ 2 byte (16 bit)sizeof(long) ≥ 4 byte (32 bit)sizeof(short) ≤ sizeof(int)sizeof(int) ≤ sizeof(long)Az int mindig az adott arcitektúrán a gépi szó mérete
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 5 / 43
C++ típusok C++ nyelvben használható típusok, változók, aritmetika
Az MS Visual Studio-ban használható típusok
(Nem csak ANSI C++ típusok)
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 6 / 43
C++ típusok C++ nyelvben használható típusok, változók, aritmetika
Változók és aritmetika
Aritmetikai műveletek: char, int, float, double, enum+ // összeadás vagy előjel, egy- és kétoperandusú is lehet- // kivonás vagy előjel, egy- és kétoperandusú is lehet* // szorzás/ // osztás% // maradékképzés
Összehasonlító műveletek: char, int, float, double, enum== // egyenlő!= // nem egyenlő< // kisebb> // nagyobb<= // kisebb vagy egyenlő>= // nagyobb vagy egyenlő
Bitenkénti operátorokLogikai operátorokLéptető operátorok
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 7 / 43
C++ típusok Referencia típus
Referencia (hívatkozás) típus
Egy objektum "álneve" (alias)Függvények (és túlterhelt operátorok) paramétereinek és visszatérésiértékeinek megadására használható hatékonyanA jelölés jelentése: "Hivatkozás A-ra"Példa:
int i = 100;int& ref = i; // r és i itt ugyanarra az int-re hivatkoznakint x = ref; // x = 100ref = 200; // i = 200
A referencia célpontját létrehozáskor meg kell határozni!!!Példa:
int& ref = i; // OKint& ref2; // Hibás referencia megadás
// nincsen kezdeti érték megadvaextern int& ref3; // OK (Később kap értéket)
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 8 / 43
C++ típusok Referencia típus
Referencia (hívatkozás) típus
A referencián nem hajtódik végre utasítás (nem változik az értéke)Az utasítás mindig azon hajtódik végre, amire mutat a referenciaPélda:
int i = 0;int& ref = i;ref++; // i növeléseint* p = &ref; // p az i-re mutat
void cplusplus(int& c) { c++; }
Egyes fordítók fizikailag referenciával valósítják meg a referencia típust
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 9 / 43
C++ típusok Felhasználói típus
Felhasználói típus
Absztrakt típus (abstract data type, ADT)Felhasználói típus (user-defined type)A beépített típusokkal közel azonos viselkedésMegközelítés:"Döntsd el, mely típusokra van szükségés mindegyikhez biztosíts teljes műveletkészletet."StroustrupAbsztrakt típus (abstract data type, ADT)
A felület elszigeteli a felhasználót a megvalósítás részleteitőlKonkrét típus
A felület nem teljesen szigeteli el a felhasználót a megvalósításrészleteitől
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 10 / 43
C++ típusok Felhasználói típus
Felhasználói típus - példa
Példa:Complex számok kezelése
class CComplex{private:
double Im, Re;public:
CComplex(double x, double y, bool IsImRe=1);CComplex() {Im=0; Re=0;};double GetIm() const {return Im;};double GetRe() const {return Re;};double GetR() const {return sqrt(Re*Re+Im*Im);}double GetPhi();double SetIm(double x) {Im = x;};double SetRe(double x) {Re = x;};
};
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 11 / 43
C++ típusok Felhasználói típus
Felhasználói típus - operátor
Probléma:Milyen műveletek értelmezettek a típusonÖsszeadás, kivonás, összehasonlítás, stb.
I. megoldásOsztályfüggvények alkalmazásaMinen művelethez meg kell írniMeg kell hívni egyesével a függvényeket az osztálypéldányon
I. megoldásOperátorok alklamazása (+ - * / == != stb.)Operátorokat el kell készíteni
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 12 / 43
C++ típusok Felhasználói típus
Felhasználói típus operátora - példa
Példa:Complex számok kezelése
class CComplex{private:
double Im, Re;public:
CComplex(double x, double y, bool IsImRe=1);CComplex() {Im=0; Re=0;};double GetIm() const {return Im;};double GetRe() const {return Re;};double GetR() const {return sqrt(Re*Re+Im*Im);}double GetPhi();double SetIm(double x) {Im = x;};double SetRe(double x) {Re = x;};
friend CComplex operator+(CComplex a1, CComplex a2);friend CComplex operator-(CComplex a1, CComplex a2);friend CComplex operator/(CComplex a1, CComplex a2);friend CComplex operator*(CComplex a1, CComplex a2);friend bool operator==(CComplex a1, CComplex a2);friend bool operator!=(CComplex a1, CComplex a2);
};
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 13 / 43
C++ típusok Felhasználói típus
Felhasználói típus operátora - példa
Példa:Complex számok kezelése
CComplex operator+(CComplex a1, CComplex a2){
return CComplex(a1.Re+a2.Re, a1.Im+a2.Im);}
CComplex operator-(CComplex a1, CComplex a2){
return CComplex(a1.Re-a2.Re, a1.Im-a2.Im);}
bool operator==(CComplex a1, CComplex a2){
return ((a1.Re==a2.Re)&&(a1.Im==a2.Im))?true:false;}
bool operator!=(CComplex a1, CComplex a2){
return ((a1.Re==a2.Re)&&(a1.Im==a2.Im))?false:true;}
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 14 / 43
C++ típusok Felhasználói típus
Felhasználói típus operátora - példa
Példa:Complex számok kezelése
ComplexExample(){CComplex c1(1,0);
CComplex c2(1,1);
CComplex c3 = c1 + c2*CComplex(1, 2);// ...if (c1 != c2)
c3 = (c1/c2) + c2;else
c3 = (c1/c2);}
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 15 / 43
C++ típusok Mutatók, Tömbök
Mutatók
Minden változó memóriában levő helye (címe) képezhetőMinden függvény memóriában levő helye (címe) képezhetőEz a cím mutató típusban (pointerben) tárolhatóA pointer típus értékkészlete egy memória címA pointer mindig egy meghatározott típusú objektumra mutat
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 16 / 43
C++ típusok Mutatók, Tömbök
Mutatók használata
Mutató típus definiálása: pointer_tipusa *pointer_neveVáltozó címének meghatározása: &valtozo_neveMutató által mutatott változó értéke: *pointer_neve
int i, *ip, v[10];
i = 123;ip = &i;*ip = 123;ip = &v[2];
double d, *dpdouble* dp2;void *p;
int **ipp;int* *ipp2;
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 17 / 43
C++ típusok Mutatók, Tömbök
Tömb alkalmazása
Tömb méreteA fordítóprogram határozza meg az elemtípusok méretének afüggvényébenA méret mindig fordítási időben döl el!Méret meghatározása: sizeof(tömb_neve)/sizeof(elem_típusa);int v[50];int n=sizeof(v)/sizeof(int);
Tömb bejárásaÁltalában for ciklussal történikint i;register int i; //Nagy elemszám eseténfor(i=0; i<n; v[i++]=0);
Kezdeti érték adása tömböknektipus tömb_neve[] = érték1, érték2...;A tömb méretét a fordító határozza meg a felsorolt konstansok alapjánPélda:int adatok[] = 1, 2, 3, 4, 5;char szoveg[] = "alma";char szoveg2[] = 65, 76, 77, 65, 0 ;
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 18 / 43
C++ típusok Mutatók, Tömbök
Többdimenziós tömbök
Megadása: típus tömb_neve[méret_dim1][méret_dim2]típus tömb_neve[méret_dim1][méret_dim2][méret_dim3]típus tömb_neve[méret_dim1][méret_dim2]...[méret_dim_n]
int i,j;int tomb2d[100][50]
for(i=0; i<100; i++)for(j=0; j<50; j++)
tomb2d[i][j]=0;
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 19 / 43
C++ típusok Template osztály
Sablon/Tamplate osztály
Ötlet:Az osztály általánosítása → sablon létrehozása
template<class T> előtag T-t az utána következő deklarációparaméterévé teszi.Példa:Verem kezelése
template<class T> class CStack{
T* v;int max_size;int top;
public:class Underflow { }; // hibakezelésclass Overflow { }; // hibakezelésCStack(int s); // konstruktor~CStack(); // destruktorvoid Push(T);T Pop();
};
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 20 / 43
C++ típusok Template osztály
Sablon/Template osztály
Példa:Verem kezelése (Függvények megadása)
template<class T> void CStack<T>::Push(T c){
if (top == max_size) throw Overflow();v[top] = c;top = top + 1;
}
template<class T> T CStack<T>::Pop(){
if (top == 0) throw Underflow();top = top - 1;return v[top];
}
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 21 / 43
C++ típusok Template osztály
Sablon/Template osztály
Példa:Verem kezelése (Függvények megadása)
CStack<int> st_int(100); // verem 100 int-nekCStack<CComplex> st_cmplx(50); // verem 50 komplex számnakCStack< list<int> > st_list(50); // verem 50, int-ből álló lista számára
void StackExample(){
st_int.push(100);if (st_int.pop() != 100){
//... //Hiba a veremkezelésben}
st_cmplx.push(Ccomplex(0,0));if (st_cmplx.pop() != CComplex(0,0)){
//... //Hiba a veremkezelésben}
}
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 22 / 43
C++ típusok Template osztály
Sablon/Template osztály használata
Adatszerkezetek kezeléseListaVektorTömbök (map)stb.
Fordítási időben van jelentőségeNem növeli meg futási időt a "hagyományos kódoláshoz" képestContainer Class (tároló, konténer)
Osztály elnevezésValamilyen típusú elemek gyűjteményét tartalmazza
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 23 / 43
Standard könyvtárak iostream
iostream
Adatfolyam-bemeneti és -kimeneti szolgáltatásokKimenetek és bemenetek kezelése
A << kimeneti operátor második operandusát beírja az elsőbeA >> bemeneti operátor első operandusát beírja a másodikba
Karakterláncok (string) kezeléseListák, vektorok kezelése...Példa:
#include <iostream>#include<string>#include<list>
CComplex c(1,0), c2(1,1);std::cout << "Im: " << c.GetIm() << " Re: " << c.GetRe() << " \n\n";
std::string str = "Szoveg...";
int i;std::in >> i;
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 24 / 43
Standard könyvtárak iostream
Kimenet
iostream könyvtár meghatároz egy kimenetetA << kimeneti operátor második operandusát beírja az elsőbePélda:
#include <iostream>#include<string>#include<list>//...CComplex c(1,0), c2(1,1);
printf("Im: %lf \nRe : %lf \n\n", c.GetIm(), c.GetRe());
std::cout << "Im: ";std::cout << c.GetIm();std::cout << " Re: ";std::cout << c.GetRe();std::cout << "\n\n";
std::cout << "Im: " << c.GetIm() << " Re: " << c.GetRe() << " \n\n";std::string str = "Szoveg...";
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 25 / 43
Standard könyvtárak iostream
Névtér
Standard könyvtár az std névtérhez tartozikstd::cout helyett, ha cout nem működik
#include <iostream>#include<string>
//...CComplex c(1,0), c2(1,1);
cout << "Im: ";cout << c.GetIm();cout << " Re: ";cout << c.GetRe();cout << "\n\n";
string str = "Szoveg...";
Hiba:complex.cpp(130) : error C2065: ’cout’ : undeclared identifier
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 26 / 43
Standard könyvtárak iostream
Névtér beállítása
Névtér beállításausing namespace nevter_neve;
#include <iostream>#include<string>
//...CComplex c(1,0), c2(1,1);
std::cout << "Im: "; //Itt nem hagyható el az std::std::cout << c.GetIm();std::cout << " Re: ";std::cout << c.GetRe();std::cout << "\n\n";
using namespace std;cout << "Im: " << c.GetIm() << " Re: " << c.GetRe() << " \n\n";string str = "Szoveg...";
Hiba: (a névtér beállítása előtt hanyagoljuk el a beállítást)complex.cpp(130) : error C2065: ’cout’ : undeclared identifier
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 27 / 43
Standard könyvtárak iostream
Bemenet
istreams szolgál bemenetek kezeléséreA >> bemeneti operátor első operandusát beírja a másodikbaPélda:
#include <iostream>\\...
using namespace std;\\...
int i;cin >> i;double d;cin >> d;
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 28 / 43
Standard könyvtárak iostream
Bemenet
Egész sor beolvasásagetline() függvény segítségévelPélda:
#include <iostream>#include <string>\\...
using namespace std;\\...
string str;
cout << "Írja be a nevét!\n";getline(cin,str);cout << "Helló, " << str << "!\n";
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 29 / 43
Standard könyvtárak iostream
Karakterlánc (string)
Karaktersorozatok eltárolására használható típusKaraktrlánc-műveletekOperátorok használata (pl.: + - == !=)
#include <iostream>#include<string>
//...using namespace std;
string str1 = "Programozás ";string str2 = "Előadás ";string TantargyNev = str1+str2;
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 30 / 43
Standard könyvtárak iostream
Karakterlánc (string)
Kimenetre, bemenetre átirányítható:string str1 = "Helyes?";string str2;
cout << str1;cin >> str2;
Összehasonlításstring str2;
cout << "Helyes? (igen/nem);cin >> str2;if (str2 == "igen"){
...}
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 31 / 43
Standard könyvtárak iostream
Karakterlánc (string)
Paraméterként átadható#include <iostream>\\...
using namespace std;\\...
void AddNewLine(string& str1, string& str2){
str1 = str1 + ’\n’;str2 += ’\n’;
}
\\ ...
string str1="123";string str2="1234";AddNewLine(str1, str2);cout << str1 << " " << str2 << " ";
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 32 / 43
Standard könyvtárak iostream
Stringeken értelmezhető műveletek/fogalmak
BejárókAz elemek (karakterek) eléréseKonstruktorHibák kezelése, detektálásaÉrtékadásÁtalakítás C stílusú karakterláncraÖsszehasonlításBeszúrásÖsszefűzésKeresésCsereRészláncokMéret és kapacitás (memóriakezeléssel kapcsolatos)Ki- és bemeneti műveletekFelcserélés
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 33 / 43
Standard könyvtárak iostream
C stílusú string
string típus átalakíthatóKompatibilítás miatt szükséges/hasznosc_str() tagfüggvény végzi az átalakítást
#include <iostream>#include <string>\\...
using namespace std;\\...
void 2_C_String(string& str1){
printf("Szoveg: %s\n",str1.c_str());}
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 34 / 43
Tárolók Tárolók
Szabványos tárolók
Szabványos tárolókvector<T> Változó hosszúságú vektorlist<T> Kétirányú láncolt listaQueue<T> SorStack<T> VeremDeque<T> Kétvégű sorPriority_queue<T> Érték szerint rendezett sorset<T> HalmazMultiset<T> Halmaz, melyben egy érték többször is előfordulhatMap<kulcs,érték> Asszociatív tömbMultimap<kulcs,érték> Asszociatív tömb, melyben egy kulcstöbbször előfordulhat
std névtérhez tartoznakHeader állományokat be kell rakni!<vector>, <list>, <map>, stb.
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 35 / 43
Tárolók Vektor
Vektor
Probléma:C nyelvben rögzített méretC nyelvben fordítási időben meg kell adni a méretetNem hatékony a memóriakezelés
Példa:struct VarStar{public:
string Name; //C++double JD;double Magnitude;
};
VarStar Observe[1000];
Observe[2].JD = 2455259.5;Observe[2].Name = "R CRB";Observe[2].Magnitude = "6.2";
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 36 / 43
Tárolók Vektor
Vektor
Megoldás, hiányosságok pótlása:Futási időben megadható méretFutási időben változtatható méretHibás indexelés detektálása
Példa:#include <string>#include <vector>using namespace std;
class CVarStar{public:
string Name;double JD;double Magnitude;
};
vector<CVarStar> Observe(1000);Observe[2].JD = 2455259.5;Observe[2].Name = "R CRB";Observe[2].Magnitude = "6.2";
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 37 / 43
Tárolók Vektor
Vektor kezelése
Vektor bejárásaHasonlóan a C-s vektorbejáráshozPélda:
void PrintStar(int i){
cout << Observe[i].Name << ’ ’ << Observe[i].JD << ’ ’ <<Observe[i].Magnitude << ’\n’;
}
void PrintObserve(){
for(i=0; i<Observe.size(); i++)PrintStar(i);
}
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 38 / 43
Tárolók Vektor
Vektor mérete
Vektor méretének lekérdezésesize() függvény segítségévelVektor méretének megváltoztatása
Futási időben változtatható méretNövelhető, CsökkenthetőA méret lekérdezhetőPélda:
void AddStars(int n){
Observe.resize(Observe.size()+n);}
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 39 / 43
Tárolók Vektor
Tartományellenőrzés
Alapértelmezés szerint nincsen benne tartományellenőrzésAkár túl is tudjuk indexelniPélda:
VarStar Observe[1000];Observe[1001].JD = 2455259.5;Observe[1002].Name = "R CRB";Observe[1003].Magnitude = "6.2";
Gondoskodni kell az ellenőrzősről!Saját függvénnyel leszármaztatott osztálybanKivételkezeléssel
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 40 / 43
Tárolók Lista
Lista
A vektor adatszerkezetben az adatok törlése, hozzáfűzése csaknehézkesen oldható megMegoldás
Lista használataPélda:
#include <list>
using namespace std;
list<CVarStar> ObserveList;void AddStar(const CVarStar& obs, list<CVarStar>::iterator i){
ObserveList.push_front(obs); // hozzáadás a lista elejéhezObserveList.push_back(obs); // hozzáadás a lista végéhezObserveList.insert(i, obs); // hozzáadás az i által mutatott elem elé
}
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 41 / 43
Tárolók Asszociatív tömb
Asszociatív tömb
Listában a keresés csak nehezen lehetségesListában a keresés rossz hatékonyságúOlyan adatszerkezet kellene, amely a következőket tudja:
Támogatja a beszúrástTámogatja a törléstTámogatja az érték szerinti keresést
MegoldásStandard könyvtár map típusaA map egy értékpár-tároló
Léterehozásamap<tipus_)kulcs,tipus_ertek> asszociativ_tomb_neve;
Szokásos elnevezései: map / asszociatív tömb / szótár
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 42 / 43
Tárolók Asszociatív tömb
Asszociatív tömb - példa
Példa:#include <list>#include <string>
using namespace std;
map<string,double> ObserveMap;void PrintOneObserve(const string& starname){
if (double i = ObserveMap[starname])cout << starname << ’ ’ << i << ’\n’;
}
Illeszkedést keresHa nem talál illeszkedést az a kulcsra (starname), a ObserveMap egyalapértével tér vissza
Fodor A. (Pannon Egyetem) Programozás 2010. március 4. 43 / 43
Top Related