Tartalom. Bevezetés. Referenciák. Objektum-orientált programozás. Sablonok. Standard Template Library. Template Metaprogramozás. C++0x.

Hasonló dokumentumok
C++ Standard Template Library (STL)

Alprogramok, paraméterátadás

Fejlett programozási nyelvek C++ Iterátorok

Challenge Accepted:C++ Standard Template Library

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

1) Hány byte-on tárol a C++ egy karaktert (char)? implementáció-függő ( viszont lásd 79. megjegyzés ) 1 8 4

Bevezetés a programozásba 2

C++ Standard Template Library

C vagy C++? Programozási Nyelvek és Fordítóprogramok Tanszék. Pataki Norbert. Programozási Nyelvek I.

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

Programozás II gyakorlat. 8. Operátor túlterhelés

Programozás II. 4. Dr. Iványi Péter

Programozás II. 2. Dr. Iványi Péter

503.AA Megoldo Arisztid 503.A

1.AA MEGOLDÓ BERCI AA 1.

500.AA Megoldo Arisztid 500.A

500. AA Megoldó Alfréd AA 500.

0. Megoldó Manó 0. Programozás alapjai 2. (inf.) pót zárthelyi gyak. hiányzás: 2 n/kzhp: n/11,5. ABCDEF IB.028/2.

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

117. AA Megoldó Alfréd AA 117.

Programozás. C++ típusok, operátorok. Fodor Attila

C++ Gyakorlat jegyzet 12. óra

PROGRAMOZÁSI NYELVEK - CPP. ELŐADÁS JEGYZET

1. Alapok. Programozás II

1. Bevezetés A C++ nem objektumorientált újdonságai 3

Bevezetés a programozásba Előadás: A const

C++ Gyakorlat jegyzet 9. óra

.AA Megoldó Alfréd AA.

GTL Graphical Template Library

1000.AA Megoldo Alfréd 1000.A

Fejlett programozási nyelvek C++

128. AA Megoldó Alfréd AA 128.

500.AJ Megoldó Magyar Magdolna 500.J

Generikus Típusok, Kollekciók

500.AA Megoldó Kulcsár 500.A

Pénzügyi algoritmusok

500. CC Megoldó Alfréd CC 500.

Fejlett programozási nyelvek C++ Sablonok és adatfolyamok

Programozási Nyelvek (C++) Összefoglaló

A C++ Standard Template Library rövid összefoglalás

Programozás módszertan

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

XIII. STL. Tároló Bejáró Algoritmus. XIII.1 A vector #include <vector> #include <vector> #include <algorithm> using namespace std;

Programozási Nyelvek: C++

C++ Gyakorlat jegyzet 7. óra

Programozás alapjai II. (7. ea) C++

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

A C++11 újdonságai. Smidla József Operációkutatási Laboratórium október 9.

C++ Gyakorlat jegyzet 8. óra

Bevezetés a programozásba. 8. Előadás: Függvények 2.

228. AA Default Konstruktor AA 228.

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

A lista eleme. mutató rész. adat rész. Listaelem létrehozása. Node Deklarálás. Létrehozás. Az elemet nekünk kell bef zni a listába

Bevezetés a programozásba I.

Bevezetés, a C++ osztályok. Pere László

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Generatı v programok helyesse ge

Bevezetés a programozásba. 11. Előadás: Esettanulmány

Programozási technológia

C++ Gyakorlat jegyzet 10. óra

Programozás alapjai II. (7. ea) C++

Bevezetés a programozásba. 9. Előadás: Rekordok

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Programozás alapjai 2. (2. ea) C++

Generikus osztályok, gyűjtemények és algoritmusok

Bevezetés a Programozásba II 12. előadás. Adatszerkezetek alkalmazása (Standard Template Library)

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

500. DD Megoldó Alfréd DD 500.

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

Memóriakezelés, dinamikus memóriakezelés

Szövegek C++ -ban, a string osztály

Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (1. ea) C++

Programozás C és C++ -ban

- 1 - Konstansok használata. Döntsük el, van-e fordítási idejű hiba az alábbi programrészletekben! a) const char * str="zh"; str[0]++;

Programozás alapjai II. (2. ea) C++

Programozás alapjai II. (2. ea) C++

C++ programok fordítása

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

Osztály és objektum fogalma

Programozás alapjai II. (8. ea) C++ bejárók és egy tervezési példa

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

feladat pont min elért

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

GENERIKUS PROGRAMOZÁS Osztálysablonok, Általános felépítésű függvények, Függvénynevek túlterhelése és. Függvénysablonok

Algoritmizálás + kódolás C++ nyelven és Pascalban

C++11 TÓTH BERTALAN C++ PROGRAMOZÁS STL KONTÉNEREKKEL

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

3. Osztályok II. Programozás II

Programozás C++ -ban 2007/7

Programozás C++ -ban

C++ Gyakorlat jegyzet 10. óra.

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Bevezetés a programozásba I.

feladat pont min elért

mul : S T N 1 ha t S mul(s, t) := 0 egyébként Keresés Ezt az eljárást a publikus m veletek lenti megvalósításánál használjuk.

Programozás alapjai II. (1. ea) C++

Átírás:

C++ Pataki Norbert Eötvös Loránd Tudományegyetem, Programozási Nyelvek és Fordítóprogramok Tanszék, Budapest patakino@elte.hu ELTE Nyári egyetem 2011

Tartalom Bevezetés Referenciák Objektum-orientált programozás Sablonok Standard Template Library Template Metaprogramozás C++0x Összefoglalás

Bevezetés A C++ alapjai 1980-as évek óta; Bjarne Stroustrup C++ Szabvány: 1998/2003 C++0x A C programozási nyelvre alapul; reverse kompatibilitás Hatékonyság Multiparadigmás programozás Fordítóprogramok: g++, Microsoft Visual Studio, Comeau, Intel, stb.

Bevezetés A C alapjai Imperatív, procedurális programozás Vezérlési szerkezetek, függvények Saját típusok: rekordok szabványkönyvtár

Bevezetés Hello World #include <stdio.h> int main() printf( "Hello World!\n" ); return 0; }

Bevezetés Bővítések C-hez képest Függvény túlterhelés Referenciák (álnevek) Objektum-orientált paradigma: osztályok, polimorfizmus Osztályok Öröklődés Polimorfizmus Kivételkezelés Sablonok Kényelmesebb, biztonságosabb, bővebb szabványkönyvtár...

Bevezetés Típusok sizeof(char) az egység sizeof(char) sizeof(short) sizeof(int) sizeof(long) sizeof(float) sizeof(double) sizeof(long double) sizeof(bool) sizeof(long)

Bevezetés Fordítás menete Preprocesszor: szövegátalakítás Nyelvi fordító: tárgykódok (object-ek) előállítás Linker: tárgykódok összefésülése

Bevezetés Hello World #include <iostream> int main() std::cout << "Hello World!" << std::endl; }

Referenciák Referenciák koncepciója int i = 5; // tárterület lefoglalása és // azonosító hozzárendelése // a tárterülethez int& r = i; // azonosító hozzárendelése // a tárterülethez

Referenciák Referenciák Valamilyen létező objektumnak az álneve Kötelező inicializálni Mindig ugyanannak az objektumnak az álneve, nem változhat meg, hogy mire hivatkozik Nincs nullreferencia

Referenciák Referencia-szerinti paraméterátadás void f( int& i ) //... } int x = 10; f( x ); // OK f( x+2 ); // ford.hiba f( 5 ); // ford.hiba

Referenciák Referencia-szerinti paraméterátadás Az alprogram lokális változója (i) egy álneve (alias-a) a meghíváskor átadott paraméternek (x). Nincs másolás: az eredeti változóval dolgozik az alprogram A függvényhívás során, amikor a függvényben i megváltozik, akkor a külső x is megváltozik (hiszen a kettő ugyanaz) A függvényhívás után x értéke megváltozhat a függvényhívás előtti állapothoz képest. Információ közvetítése a hívó irányába Nincs létrehozási, másolási, felszabadítási költség

Referenciák Konstans referencia-szerinti paraméterátadás void f( const int& i ) //... } int x = 10; f( x ); // OK f( x+2 ); // OK f( 5 ); // OK

Referenciák Konstans referencia-szerinti paraméterátadás Az alprogram lokális változója (i) egy olyan álneve (alias-a) a meghíváskor átadott paraméternek (x), amelyen keresztül nem változik meg az értéke. Nincs másolás: az eredeti változóval dolgozik az alprogram A függvényhívás után x értéke ugyanaz, mint a függvényhívás előtti. Nincs létrehozási, másolási, felszabadítási költség

Referenciák Példák void swap( int a, int b ) int tmp = a; a = b; b = tmp; } void swap( int& a, int& b ) int tmp = a; a = b; b = tmp; }

Objektum-orientált programozás Osztályok class Complex double re; double im; };

Objektum-orientált programozás Osztályok, konstruktor class Complex double re; double im; public: Complex( double r = 0.0, double i = 0.0 ) re = r; im = i; } };

Objektum-orientált programozás Konstruktorok int main() Complex zero; Complex i( 0.0, 1.0 ); Complex nc = zero; Complex seven( 7.0 ); }

Objektum-orientált programozás Osztályok, tagfüggvények class Complex double re, im; public: Complex( double r = 0.0, double i = 0.0 ) re = r; im = i; } double get_re() const return re; } double get_im() const return im; } };

Objektum-orientált programozás Osztályok, tagfüggvények Complex c( 5.32, 7.34 ); std::cout << c.get_im() << std::endl;

Objektum-orientált programozás Operátorok Túlterhelhető (pl. operator+) ill. Nem túlterhelhető operátorok (pl. operator.) Fix argumentumszám (kivétel operator())

Objektum-orientált programozás Operátorok Complex a( 2.1, 4.4 ); Complex b( 4.2, 3.8 ); Complex c = a + b; // a.operator+( b ) tagfüggvényként // operator+( a, b ) globálisként std::cout << c; // std::cout.operator<<( c ) tagfüggvényként // operator<< ( std::cout, c ) globálisként

Objektum-orientált programozás Hibás operátor class Complex double re, im; public: //... Complex operator+( const Complex& c ) const return Complex( re + c.re, im + c.im ); } };

Objektum-orientált programozás Hibás operátor Complex a( 8.13, 5.4 ); Complex b = a + 7.3; // OK... // a.operator+( 7.3 ) Complex b = 7.3 + a; //? 7.3.operator+( a );

Objektum-orientált programozás Operátorok class Complex...}; std::ostream& operator<<( std::ostream& o, const Complex& c ) o << c.get_re() << " + " << c.get_im() << i ; return o; } Complex operator+( const Complex& a, const Complex& b ) return Complex( a.get_re() + b.get_re(), a.get_im() + b.get_im() ); }

Objektum-orientált programozás Öröklődés #include <string> #include <vector> using namespace std; int main() vector<int> v( 5 ); string s1( 5 ); string s2( 0 ); } // OK // ford. hiba // futási hiba

Objektum-orientált programozás Öröklődés class safe_string std::string s; public: safe_string( const char* p ): s( p? p : "" ) } void push_back( char t ) s.push_back( t) }; int size() const return s.size(); } //... };

Objektum-orientált programozás Öröklődés class safe_string: public std::string public: safe_string( const char* p ) : std::string( p? p : "" ) } // konstruktorok nem öröklődnek... };

Objektum-orientált programozás Polimorfizmus struct Base virtual void f() const std::cout << "Base::f()" << std::endl; } virtual ~Base() } };

Objektum-orientált programozás Polimorfizmus struct Der virtual void f() const std::cout << "Der::f()" << std::endl; } virtual ~Der() } };

Objektum-orientált programozás Polimorfizmus Base* bp = new Base(); bp->f(); delete bp; bp = new Der(); bp->f();

Sablonok Igény a sablonokra Típussal (és egyéb fordítási idejű adatokkal) paraméterezés Függvény és osztály sablonok létrehozása: nem kell előre megadni, hogy milyen típussal dolgozik a sablon

Sablonok Függvénysablonok template <class T> const T& max( const T& a, const T& b ) return a < b? b : a; }... std::cout << max( 4, 2 ); std::cout << max( 6.3, 7.8 );

Sablonok Sablonok Sablonok példányosítása fordítási időben Paraméterdedukció Nem generálódik kód, amíg nem példányosítjuk Típus megszorítások

Standard Template Library Az STL komponensei Konténerek Algoritmusok Iterátorok Funktorok Adapterek

Standard Template Library Konténerek STL-ben Szekvenciális: vector, list, deque Asszociatív: set, multiset, map, multimap

Standard Template Library vector Egybefüggő tárterületen azonos típusú elemek sorozata Elemek indexelve (0-tól kezdve) Elemek elérése gyors Elem beszúrása vector végére gyors Elem beszúrása máshova lassabban

Standard Template Library vector #include <vector> using namespace std; vector<int> v; // üres vector létrehozása v.push_back(4); // elem beszúrása vector végére v.pop_back(); // utolsó elem törlése // Ötelem"u vector létrehozása, minden eleme 3.2 vector<double> vd(5, 3.2); int s = vd.size(); vd[1] = 4.76; // Elemek elérése vd.back() = 4.17; // Utolsó elem elérése vd.front() = 1.2; // Els"o elem elérése

Standard Template Library list Elemek szétszórtan helyezkednek el Elemek nincsen indexelve i-edik elérése lassú Elem beszúrása bárhova gyors Következő / előző elem érhető el gyorsan

Standard Template Library list #include <list> using namespace std; list<double> l; // üres vector létrehozása l.push_front(4.5); // elem beszúrása lista elejére l.pop_front(); // utolsó elem törlése l.push_back(1.1); // elem beszúrása lista végére list<double> vl(3, 6.32); int s = vl.size(); l.back() = 4.17; l.front() = 1.2; l.sort(); l.remove(1.2); l.reverse(); // Utolsó elem elérése // Els"o elem elérése // Lista rendezése // Adott értékek törlése // Lista megfordítása

Standard Template Library deque Kettős végű sor Egybefüggő tárterületek szétszórtan helyezkednek el Elemek indexelve vannak Elemek elérése gyors Elem beszúrása tároló elejére / végére gyors Elem beszúrása közepére lassabban

Standard Template Library deque #include <deque> #include <string> using namespace std; deque<string> d; d.push_front( "Hello" ); d.push_back( "World" ); d[0] = "Goodbye"; d.back() = "Cruel World"; d.pop_back(); d.pop_front();

Standard Template Library set Elemek sorrendje: rendezettség Minden elem legfeljebb egyszer szerepelhet Műveletek kihasználják a rendezettséget: gyors keresés, gyors beszúrás, stb.

Standard Template Library set #include <set> #include <cstdlib> using namespace std; srand(time(0)); set<int> nums; while( nums.size() < 5 ) nums.insert( (rand() % 90)+1 ); }

Standard Template Library multiset Elemek sorrendje: rendezettség Azonos elemek többször is szerepelhetnek Műveletek kihasználják a rendezettséget: gyors keresés, gyors beszúrás, stb.

Standard Template Library multiset #include <set> using namespace std; multiset<int> m; m.insert(3); int s = m.size(); int i = m.count(3);

Standard Template Library map Asszociatív tömb: elemek indexelve Nem feltétlenül 0-tól kezdve Nem feltétlenül egymás utáni indexek Nem feltétlenül egészek Kulcs alapján rendezett tárolás

Standard Template Library map #include <map> #include <string> #include <iostream> using namespace std; map<string, string> phones; phones["x.y."] = "36(20)555-1234"; phones["a.b."] = "36(30)555-5555"; //... cout << phones["x.y."];

Standard Template Library Algoritmusok STL-ben Konténer-független, újrafelhasználható, globális függvénysablonok Általánosítás (generalizáció), paraméterezhetőség, de nem mehet a hatékonyság rovására Megoldások gyakori feladatokra Nem biztos, hogy egy algoritmus az összes konténerrel működik Pl. find, sort, count, for_each

Standard Template Library Iterátorok STL-ben Konténerek bejárása Algoritmusok és konténerek közötti kapcsolat megteremtése Az iterátorok interface-e a pointer-aritmetikán alapul: operator++, operator *, operator==, stb.

Standard Template Library Funktorok STL-ben Egyszerű felhasználói osztályok, amelyeknek van operator()-a Ezen az operator()-on keresztül felhasználói kódrészletek hajtódnak végre a könyvtáron belül Tipikus alkalmazások: felhasználói rendezések, predikátumok, műveletek Unáris, Bináris funktorok Előny: inline-osítás,...

Standard Template Library Példa class Print std::ostream& os; public: Print( std::ostream& o ): os ( o ) } template <class T> void operator()( const T& t ) os << t << ; } };

Standard Template Library Példa std::set<double> sd; std::list<std::string> ls; std::deque<int> di; std::for_each( sd.begin(), sd.end(), Print( std::cout ) ); std::for_each( ls.begin(), ls.end(), Print( std::cerr ) ); std::for_each( di.begin(), di.end(), Print( std::cout ) );

Standard Template Library Példa struct is_even: std::unary_function<int, bool> bool operator()( int i ) const return 0 == i % 2; } };

Standard Template Library Példa std::list<int> li; //... std::list<int>::iterator i = std::find_if( li.begin(), li.end(), is_even() ); std::vector<int> ve; //... std::vector<int>::iterator i = std::find_if( ve.begin(), ve.end(), std::not1( is_even() ) );

Standard Template Library Példa template <class T> struct Less: std::binary_function<t, T, bool> bool operator()( const T& a, const T& b ) const return a < b; } };

Standard Template Library Példa std::set<int, Less<int> > a; std::vector<double> v; //... v.erase( std::remove_if( v.begin(), v.end(), std::bind2nd( Less<double>(), 5.5 ) ), v.end() );

Standard Template Library Spec. iterátorok // másoljuk a std.input-ot std.output-ra... std::copy( std::istreambuf_iterator<char>( cin ), std::istreambuf_iterator<char>(), std::ostreambuf_iterator<char>( cout ) );

Standard Template Library Inserterek motivációja const int N = 10; double v[n];... double cv[n]; // v másolása cv-be: copy( v, v + N, cv ); // ez általában nem m"uködik a valódi STL // konténerek esetében...

Standard Template Library copy implementációja template <class InIt, class OutIt> OutIt copy( InIt first, InIt last, OutIt dest ) while ( first!= last ) *dest++ = *first++; } return dest; }

Standard Template Library back_inserter double f( double x ) //... } list<double> values;... vector<double> results; // f-et alkalmazzuk values összes elemére, és az // adatokat results végére szúrjuk: transform( values.begin(), values.end(), back_inserter( results ), f);

Standard Template Library front_inserter double f(double x)... } list<double> values;... list<double> results; // f-et alkalmazzuk values összes elemére, és // az adatokat results elejére szúrjuk: transform( values.begin(), values.end(), front_inserter( results ), f);

Standard Template Library inserter double f(double x) //... } list<double> values; //... vector<double> results; // f-et alkalmazzuk values összes elemére, és az // adatokat results közepére szúrjuk: transform ( values.begin(), values.end(), inserter( results, results.begin() + results.size() / 2 ), f );

Standard Template Library inserter double f(double x) //... } list<double> values; //... multiset<double> results; // f-et alkalmazzuk values összes elemére, és // az adatokat results-ba szúrjuk (rendezett lesz) transform( values.begin(), values.end(), inserter( results, results.begin() ), f );

Standard Template Library back_inserter implementációja (vázlat) template <class Cont> class back_insert_iterator Cont* c; public: back_insert_iterator(cont& cont): c(&cont) } back_insert_iterator& operator++() return *this; } back_insert_iterator& operator++( int ) return *this; }

Standard Template Library back_inserter implementációja (vázlat) back_insert_iterator& operator=( typename Cont::const_reference d ) // const typename Cont::value_type& d c->push_back(d); return *this; } back_insert_iterator& operator*() return *this; } };

Standard Template Library back_inserter implementációja (vázlat) template <class Cont> back_insert_iterator back_inserter( Cont& c ) return back_insert_iterator<cont>( c ); }

Template Metaprogramozás Template Metaprogramozás Fordítási időben végrehajtodó kódok Rekurzív példányosítások, specializációk: Turing-teljes eszköz Optimalizációk, fordítási idejű ellenőrzések

Template Metaprogramozás Példa template <int N> struct Factorial enum Value = N * Factorial<N - 1>::Value }; }; template <> struct Factorial<0> enum Value = 1 }; }; int main() std::cout << Fact<5>::Value << std::endl; }

Template Metaprogramozás Expression templates Array a, b, c, d, e;... e = a + b + c + d; // e = ( ( ( a + b ) + c ) + d ); Kényelmes, karbantartható Lassú, pazarló

Template Metaprogramozás Rekurzív template-ek template <class Left, class Right> class X }; X< X<A,B>, X<C,D> > fa;

Template Metaprogramozás Rekurzív template-ek struct plus static double apply( double a, double b) return a+b; } };

Template Metaprogramozás Rekurzív template-ek template <class Left, class Op, class Right> struct X Left left; Right right; X( Left l, Right r) : left( l ), right( r ) } double operator[](int i) return Op::apply( left[i], right[i] ); } };

Template Metaprogramozás Array struct Array // szokásos: adattagok, konstruktorok, stb. template <class Left, class Op, class Right> void operator=( X<Left,Op,Right> expr) for ( int i = 0; i < N; ++i) arr[ i ] = expr[ i ]; } };

Template Metaprogramozás Array template <class Left> X<Left, plus, Array> operator+( Left a, Array b) return X<Left, plus, Array>(a,b); }

C++0x Szabványok ISO/IEC 14882:1998 ISO/IEC 14882:2003 TR1, C++0x

C++0x C++0x újítások Type inference: auto, decltype Lambda-kifejezések nullptr variadikus template, template typedef long long típus Párhuzamosság type traits, smart pointerek, hasító adatszerkezetek...

C++0x Type inference std::map<std::string, double, std::greater<std::string> > data;... std::map<std::string, double, std::greater<std::string> >::iterator i = data.begin();

C++0x Type inference std::map<std::string, double, std::greater<std::string> > data;... auto i = data.begin(); auto two = 2; auto pi = 3.14;

C++0x Type inference const std::vector<int> v(1); auto a = v[0]; decltype( v[0] ) b = 1;

C++0x foreach int a[] = 1, 2, 3, 4, 5 }; for (int &i: a) i *= 2; }

C++0x Lambda függvény motivációja std::vector<int> data; //... int total = 0; std::for_each( data.begin(), data.end(), [&total]( int x ) total += x; });

C++0x Lambda függvények Funktor típus generálása a lambda függvény alapján A operator() visszatérési érték típusa: decltype( x + y ) [](int x, int y) return x + y; } [](int x, int y) -> int int z = x + y; return z + x; }

Összefoglalás Összefoglalás A C++ multiparadigmás nyelv Szabvány: 1998 óta, C++0x C + osztályok + sablonok +..., Objektum-orientáltság: öröklődés, polimorfizmus STL: generikus programozás Template metaprogramozás