Fejlett programozási nyelvek C++ 2. előadás Antal Margit 2010 slide 1
Források [BSWEB] Bjarne Stroustrup Texas A&M University AT&T Labs Research http://www.research.att.com/~bs [BSPACT] Bjarne Stroustrup: Speaking C++ as a Native PACT Workshop, 15 September 2007, Brasov, Romania slide 2
Témakörök A standard C++ standardok, célok Absztrakció osztályok és sablonok Generikus programozás konténerek, algoritmusok és iterátorok Objektumorientált programozás Többelvű programozás slide 3
I. A standard C++ 1998-as standard (2003 javított kiadás) C++ fordítók Borland, HP/Compaq, IBM, Intel, GNU, CodeWarrior, Microsoft, Sun Platformok: Mac, IBM, Unix/Linux, Windows, Symbian, Palm, beágyazott rendszerek Általános célú programozási nyelv slide 4
C++ jellemzők általános célú programozási nyelv támogatja az absztrakciót osztály sablon támogatja az objektumorientált paradigmát egységbezárás polimorfizmus öröklődés támogatja a generikus programozást típusfüggetlen tárolók általánosított eljárások slide 5
Fordítóprogramok teljesítménye FLOPS -FLoating point Operations Per Second slide 6
C++ s greatest weakness: poor use [BSPACT] C stílusú elemek használata tömbök, void *, típuskényszerítés, makrók, stb.,,a kerék újrafeltalálása'' saját implementációk adatstruktúrákra: string, vector, list, map saját widgetek (GUI) saját perzisztencia modul saját szálkezelés Túlzásba vinni az öröklődés használatát,,mamut'' osztályhierarchiák slide 7
II. Absztrakció, osztályok [BSPACT] Fogalmak ábrázolása Szerepkörök: Érték típus (Value type) - példa! megszorítások Függvény típus függvényobjektum Erőforrás kezelő - példa! konténer, fájl, stb. Csomópont típus osztályhierarchián belül Interfész típus slide 8
Az osztály, mint "value type" [BSPACT] void f(range arg){ try { Range v1(0,3,10);// 3 in range [0,10) Range v2(7,9,100);// 9 in range [7,100) v1 = 7;// ok: 7 is in [0,10) int i = v1-v2;// extract values from Ranges arg= v1;// may throw exception v2 = arg;// may throw exception v2 = 3;// will throw exception: 3 is not in [7,100) } catch(range_error) { cerr<< Oops: range error in f() ; } } slide 9
Az osztály, mint "value type" [BSPACT] class Range { int value, low, high; // invariant: low <= value < high void check(int v) { if (v<low high<=v) throw Range_error(); } public: Range(int lw, int v, int hi) : low(lw), value(v), high(hi) { check(v); } Range(const Range& a) :low(a.low), value(a.value), high(a.high) { } Range& operator=(const Range& a) { check(a.value); value=a.value; return *this; } Range& operator=(int a) { check(a); value=a; return *this;} operator int() const { return value; }// extract value }; slide 10
Általánosított Range osztály template<class T> class Range { T value, low, high; // invariant: low <= value < high void check(t v) { if (v<low high<=v) throw Range_error(); } public: Range(T lw, T v, T hi) : low(lw), value(v), high(hi) { check(v); } Range(const Range& a) :low(a.low), value(a.value), high(a.high) { } Range& operator=(const Range& a) { check(a.value); value=a.value; return *this; } Range& operator=(int a) { check(a); value=a; return *this;} operator T() const { return value; }// extract value }; slide 11
Range<T> használata [BSPACT] Range<int> ri(10, 10, 1000); Range<double> rd(0, 3.14, 1000); Range<char> rc('a', 'a', 'z'); Range<string> rs("algorithm", "Function", "Zero"); Range< complex<double> > rc(0,z1,100);// error:< is not defined for complex slide 12
Erőforrás-kezelő osztály Erőforrások: memória, file handle, socket Mi a feladata egy ilyen osztálynak? a példány létrehozása inicializálja az erőforrást az erőforrás-hozzáférés vezérlése a példány megsemmisítésekor az erőforrást fel kell szabadítani Extra feladat: kivétel keletkezésekor az erőforrást fel kell szabadítani slide 13
Erőforrás kezelés C nyelvben void f ( const char* filename ) { FILE * f = fopen( filename, "r"); // fájlműveletek fclose( f ); } slide 14
Erőforrás kezelése C++ nyelvben class File_handle { FILE* p; public: File_handle(const char* pp, const char* r) { p = fopen(pp,r); if (p==0) throw File_error(pp,r); } File_handle(const string& s, const char* r) { p = fopen(s.c_str(),r); if (p==0) throw File_error(pp,r); } ~File_handle() { fclose(p); }// destructor // copy operations // access functions }; void f(string s){ File_handle fh(s, "r"); // use fh } slide 15
III. Generikus programozás Eredeti cél: standard tárolók típusbiztosság futásidejű típusellenőrzés nélkül hatékonyság Eredeti cél következménye: standard algoritmusok több tárolóra is alkalmazható legyen Általános cél: a fogalmak lehető legtermészetesebb és legrugalmasabb ábrázolása slide 16
Általános elemtípus int n; while (cin>>n) vi.push_back(n); sort(vi.begin(), vi.end()); string s; while (cin>>s) vs.push_back(s); sort(vs.begin(),vs.end()); template<class T> void read_and_sort(vector<t>& v){ T t; while (cin>>t) v.push_back(t); sort(v.begin(),v.end()); } slide 17
Általános művelet template<class T, class Cmp>// parameterize with comparison void read_and_sort(vector<t>& v, Cmp c = less<t>()) { T t; while (cin>>t) v.push_back(t); sort(v.begin(), v.end(), c); } vector<double> vd; read_and_sort(vd);// sort using the default < vector<string> vs; read_and_sort(vs,no_case()); // sort case insensitive slide 18
Művelet típusú paraméter [BSPACT] struct Record { string name; string addr; }; vector<record> vr; // sort(vr.begin(), vr.end(), Cmp_by_name()); sort(vr.begin(), vr.end(), Cmp_by_addr()); slide 19
Struktúra, mint függvény típus [BSPACT] struct Cmp_by_name{ bool operator()(const Rec& a, const Rec& b) const { return a.name < b.name; } }; struct Cmp_by_addr{ bool operator()(const Rec& a, const Rec& b) const { return a.addr < b.addr; } }; slide 20
Függvényen (algoritmuson) végzett általánosítások Rendezési algoritmus: Elem típusa: Milyen elemeket kell rendezni? primitív típus: int, char, double, stb. összetett típus: string, struct, class Művelet típusa: Hogyan kell az elemeket összehasonlítani? < alapértelmezett összehasonlító függvény függvényként viselkedő osztály: függvényobjektum slide 21
Iterátorok (Bejárók) Foglamak szétválasztása: az algoritmus adatokon dolgozik, de nem ismeri a tárolók belső struktúráját a tárolók adattárolással foglalkoznak, nem ismerik az algoritmusokat iterátorok lehetővé teszik az algoritmusok alkalmazását tárolókra slide 22
Iterátorok Akkumulátor algoritmus: összegzi egy tartomány elemeit int x[]={1,2,3,4,5}; vector<int>v(x, x+5); int sum1 = accumulate(v.begin(), v.end(), 0); v.begin() list<int> l(x, x+5); 1 2 3 4 5 v.end() double sum2 = accumulate(l.begin(), l.end(), 0); l.begin() l.end() 1 2 3 4 5 slide 23
Az accumulate algoritmus template<class In, class T> T accumulate(in first, In last, T init) { } while (first!=last) { init = init + *first; } ++first; return init; slide 24
IV. Objektumorientált programozás Osztályhierarchia 1. változat Shape osztály = interfész + állapot class Shape { Color col; Point center; // public: }; virtual void draw()=0; virtual void rotate(double)=0; // class Circle : public Shape { double radius; void draw() { }//... }; class Triangle : public Shape { Point a,b,c; void draw() { } //...}; slide 25
Objektumorientált programozás Osztályhierarchia 2. változat Shape osztály = csak interfész!!! class Shape { public: }; virtual void draw() = 0; virtual void rotate(double) = 0; // class Circle : public Shape { Point c; double radius; Color col; /* */ }; class Triangle : public Shape { Point a, b, c; Color col; / * */ }; slide 26
Többelvű programozás void draw_all(vector<shape*>& v) { } for_each(v.begin(), v.end(), mem_fun(&shape::draw)); slide 27