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

Hasonló dokumentumok
C++ programok fordítása

Alprogramok, paraméterátadás

1. Alapok. Programozás II

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

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

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

Pénzügyi algoritmusok

Programozási Nyelvek: C++

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

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

C++ Standard Template Library (STL)

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

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

Pénzügyi algoritmusok

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

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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) {} };

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

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

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

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

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

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

Bevezetés a programozásba I.

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

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

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

Bevezetés a programozásba I.

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

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

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Programozás 1. Dr. Iványi Péter

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Challenge Accepted:C++ Standard Template Library

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

Programozás C++ -ban

Programozás C és C++ -ban

1. Írjunk programot mely beolvas két egész számot és kinyomtatja az összegüket.

Programozás. Bevezetés. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Programozási Nyelvek (C++) Gyakorlat

C++ Gyakorlat jegyzet 12. óra

Bevezetés a C++ programozási nyelvbe

Bevezetés a programozásba. 6. Előadás: C++ bevezető

Programozás II gyakorlat. 4. Öröklődés

Bevezetés a C++ programozási nyelvbe

C++ Gyakorlat jegyzet 2. óra A jegyzetet Umann Kristóf készítette Horváth Gábor gyakorlata alapján. (2018. április 30.) 1. Láthatóság, élettartam

Bevezetés a programozásba Előadás: Fordítási egység

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?

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

ISA szimulátor objektum-orientált modell (C++)

- 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]++;

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

503.AA Megoldo Arisztid 503.A

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

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Programozás C és C++ -ban

C programozás. 1 óra Bevezetés

Vizuális, eseményvezérelt programozás XI.

C++ Gyakorlat jegyzet 7. óra

Programozás módszertan

Számítógépes grafika

500. AA Megoldó Alfréd AA 500.

Programfejlesztés. Programozás alapjai II. (3. ea) C++ Néhány programozási módszer. Korai szoftverkészítés jellemzői. Gépi nyelv? Strukturált tervezés

Bevezetés a Programozásba II 4. előadás. Adattípusok hordozhatósága

Programozás C++ -ban 2007/7

Globális operátor overloading

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

Bevezetés a programozásba I.

A Java és a C++ összehasonlítása

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

128. AA Megoldó Alfréd AA 128.

C++ Gyakorlat jegyzet 8. óra

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

GTL Graphical Template Library

Mintavételes szabályozás mikrovezérlő segítségével

Programozási Nyelvek: C++

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

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

Programozás C++ -ban 2007/1

Programozás alapjai II. (2. ea) C++ Programfejlesztés. Néhány programozási módszer. Feladatanalízis. Modellezés Tervezés. Implementáció (programozás)

0.2.1 Operátorok túlterhelése (műveletek definiálhatók felhaszn. típusokra) Kutya. Eb1. Eb2. Név (txt): Rex. Blöki. Német juhász 3

3. Osztályok II. Programozás II

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

1000.AA Megoldo Alfréd 1000.A

A C programozási nyelv III. Pointerek és tömbök.

RPC Remote Procedure Call Távoli eljárás hívás

117. AA Megoldó Alfréd AA 117.

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Mobil Informatikai Rendszerek

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

1 Rev 4. A C++ programozás alapjai- segédlet

A C programozási nyelv III. Pointerek és tömbök.

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.

Imperatív programozás

A TANTÁRGY ADATLAPJA

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

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Átírás:

Programozási Nyelvek és Fordítóprogramok Tanszék Programozási Nyelvek I.

Témák 1 Bevezetés 2 A C++ alapfilozófiája 3 Névterek/namespace-ek 4 Függvények 5 Referenciák C++-ban

Motiváció A C és a C++ nyelv kapcsolata Visszafele (backward, reverse) kompatibilitás és következményei Objektum-orientált nyelvi eszközök, implementációs lehetőségek Érdemi programozás C++-ban Programozási Nyelvek II. összehasonlítás Java-val Parancssori eszközök tudatos használata: Fordítóprogram (build eszközök), Statikus elemzés Linker, nm Valgrind Stb.

Félév rendje Tömbösített előadások/gyakorlatok Programozási Nyelv I. C++ Programozási Nyelv II. Java

Számonkérés Gyakorlat: 3 db. +/- Vizsga: elméleti, gyakorlati rész Vizsgák: vizsgaidőszakban

Ajánlott irodalom http://patakino.web.elte.hu/pny1/ Bjarne Stroustrup: A C++ Programozási Nyelv / The C++ Programming Language Scott Meyers: Hatékony C++ / Effective C++

Bjarne Stroustrup 1967 Simula 67, első objektum-orientált programozási nyelv Dennis Ritchie, Ken Thompson: 1970-es évek eleje C Bjarne Stroustrup: 1980-as évek eleje C++ Első ISO szabvány C++ 1998 További szabványok: C++03, C++11, C++14, C++17, (C++20)

A C++ koncepciói C: hatékony, jól fordítható, de nem objektum-orientált C++: hatékonyság megőrzésével, objektum-orientált programozás támogatással Backward-kompatibilitás kezdetekben és ma (Jobb) nyelvi eszközök hibák elkerülésére: Típusbiztos I/O Preprocesszor használatának csökkentése Deklarációk megkövetelése, láthatóság csökkentése Stb. További fontos nyelvi elemek: Sablonok, szabványkönyvtár, STL Erőforrás-kezelés (pl. memóriakezelés) Kivételkezelés Stb.

Programozási paradigmák C++ multiparadigmás nyelv: Procedurális programozás, C örökség Objektum-orientált programozás Standard Template Library: generikus programozás Funkcionális nyelvi elemek, metaprogramok, kódgenerálás

Hello World! #include <iostream> int main() std::cout << "Hello World" << std::endl; Fordítás: $ g++ -W -Wall -pedantic -ansi hello.cpp Futtatás (sikeres fordítás után): $./a.out

Minősített nevek std::cout, std::endl, std::string using namespace std; Szükséges-e a #include direktíva? C++: igen. C: nem, de erősen ajánlott. Szükséges-e a using direktíva? C++: nem. Szabad-e a using direktíva? C++: nem mindenhol. using std::cout; std a szabványkönyvtár névtere Java: namespace package, using import

Megközelítés C-ben Minden függvénynév legyen egyedi egy szoftver forrásában! Könyvtárak? Konvenciók. Kizárólag. OpenGL: glbindtexture bind a named texture to a texturing target glcreateshader Creates a shader object gldrawelements render primitives from array data stb. PVM: pvm_pack() pvm_reduce() pvm_send() stb.

C++: namespace namespace A int f( int x ) // A::f return x + 1; namespace B int f( int x ) // B::f return x * 2;

Névterek egymásba ágyazása namespace X namespace Y void f() std::cout << "Hello namespace"; int main() f();

Fordítási hiba $ g++ -W -Wall -pedantic -ansi ns.cpp ns.cpp: In function int main() : ns.cpp:20:5: error: f was not declared in this scope f(); ^ ns.cpp:20:5: note: suggested alternative: ns.cpp:9:8: note: X::Y::f

Névterek egymásba ágyazása kijavítva namespace X namespace Y void f() std::cout << "Hello namespace"; int main() X::Y::f();

Névtelen névtér a.cpp: namespace int x, y; void f() ++y; a.c: static int x, y; void f() ++y;

Névterek megvalósítása int x; extern int y; namespace int a; namespace A int a; namespace B int a;

Névterek megvalósítása, name mangling $ g++ -c s.cpp $ nm s.o 0000000000000000 B x 000000000000000c b _ZN12_GLOBAL N_11aE 0000000000000004 B _ZN1A1aE 0000000000000008 B _ZN1B1aE

Változások C-hez képest Túlterhelés (overloading) Alapértelmezett (default) paraméter-értékek Inline függvények

Overloading sum.cpp: int sum( int a, int b ) return a + b; int sum( const int *p, int n ) int ret = 0; for( int i = 0; i < n; ++i ) ret += p[ i ]; return ret;

Overloading megvalósítás $ g++ -W -Wall -pedantic -ansi -c sum.cpp $ nm sum.o 0000000000000000 T _Z3sumii 0000000000000014 T _Z3sumPKii sum.h: int sum( int, int ); int sum( const int*, int );

Overloading #include "sum.h" #include <iostream> int main() std::cout << sum( 4, 3 ); int v[] = 7, 2, 1, 9; std::cout << sum( v, sizeof( v ) / sizeof( v[ 0 ] ) );

Default paraméter-érték #include <iostream> void inc( int* p, int d = 1 ) (*p) += d; int main() int s = 5; inc( &s ); std::cout << s << std::endl; // 6 inc( &s, 5 ); std::cout << s << std::endl; // 11

Összehasonlítás void inc( int* p, int d = 1 ) (*p) += d; void inc( int* p ) (*p)++; void inc( int* p, int d ) (*p) += d;

C vs C++ ex.cpp: x.c: int f( int s ) return s; $ gcc -c x.c $ nm x.o 0...00000 T f x.cpp: int f( int s ) return s; $ g++ -c x.cpp $ nm x.o 0...00 T _Z1fi extern "C" int f( int s ) return s; $ g++ -c ex.cpp $ nm ex.o 0...000 T f

Inline függvény inline double square( double d ) return d * d; int main() double s = square( 3.3 ); s = square( s );

Ismétlés: pointer Pointer: olyan változó, aminek az értéke egy memóriacím: int a = 3; int b = 8; int *p = &b; *p = 1; p = &a; *p = 5; std::cout << a << << b; // 5 1

Konstansok C++-ban const int page_size = 20; for( int i = 0; i < page_size; ++i ) //... Biztonság Hatékonyság

Konstansok C++-ban const int page_size = 20; ++page; // p.cpp:4:5: error: increment of read-only variable page_size page = 10; // p.cpp:5:8: error: assignment of read-only variable page_size

Konstans-biztonság const int page_size = 20; int *p = &page_size; *p = 10;

Konstans-biztonság const int page_size = 20; int *p = &page_size; // error: invalid conversion from const int* to int* *p = 10;

Konstans-biztonság deklarációkkal int *ip; Megváltozhat, hogy hova mutat és a pointeren keresztül a mutatott érték nem változat (ezért nem mutathat konstansra) const int* cip; A pointeren keresztül a mutatott érték nem változhat (mutathat konstansra, változóra) int* const icp; Nem változhat meg, hogy a pointer hova mutat (de nem mutathat konstansra) const int* const cicp; Akkor ez is mutathat változóra :-)

Konstans-biztonság? char *msg = "Hello"; Lefordul: warning: deprecated conversion from string constant to char* msg[ 1 ] = a ; esetén: $./a.out Segmentation fault (core dumped)

Referenciák int a = 6; int b = 1; int& r = a; ++r; std::cout << a; // 7 r = b; std::cout << a; // 1 ++r; std::cout << a; // 2;

Pointer vs. Referencia Pointer: C/C++ Memóriacím Címképzés, dereferálás Megváltozhat, hogy hova mutat Nullpointer (0, nullptr) Pointer-aritmetika Nem kötelező inicializálni Referencia: C++ Álnév, alias - Mindig ugyanannak az álneve - - Kötelező inicializálni

Összehasonlítás void inc( int* p) ++(*p);... int s = 4; inc( &s ); inc( 0 ); // Jajj! void inc( int& r ) ++r;... int s = 4; inc( s ); inc( 0 ); // Ford. hiba

Konstans referenciák const int& two = 2; int s = 5; const int& r = s; ++s; // OK ++r; // error: increment of read-only reference r

Deklarációk void f( int ); void g( int& ); void h( const int& ); int& f(); mire adhatunk vissza referenciát?