kulonbsegek_a_c_es_c++_kozott

10
Programozás C és C++ -ban 2. További különbségek a C és C++ között 2.1 Igaz és hamis A C++ programozási nyelv a C-hez hasonlóan definiál néhány alap adattípust: char int float double Ugyanakkor egy új adattípus is megjelent a C++ -ban az igaz és hamis értékek reprezentálására: bool. Emlékeztető: C nyelvben egy kifejezés értéke hamis ha nullával egyenl ő. Minden más esetben igaz a kifejezés értéke. A C++ -ban az igaz érték a ‘true’ a hamis a ‘false’ értéknek felel meg. Mivel nagyon sok program még mindig a C konvenciót használja, ezért a fordító az integer értéket bool típusúvá konvertálja. Nézzünk egy nagyon egyszerű példát: #include <iostream> using namespace std; int main() { bool felt; int a; felt = false; if(felt) // ez hamis lesz a = 1; else a = 2; // ez a rész hajtódik végre cout << a << endl; return 0; } 2.2 A ‘typedef’ kulcsszó A typedef kulcsszó C++ -ban is használható típusok deklarálására, de nem szükséges a struct, union és enum definíciók esetén. Vegyük a következő definíciót: Forrás: http://www.doksi.hu

description

c es c++

Transcript of kulonbsegek_a_c_es_c++_kozott

  • Programozs C s C++ -ban

    2. Tovbbi klnbsgek a C s C++ kztt

    2.1 Igaz s hamis A C++ programozsi nyelv a C-hez hasonlan definil nhny alap adattpust:

    char int float double

    Ugyanakkor egy j adattpus is megjelent a C++ -ban az igaz s hamis rtkek reprezentlsra: bool. Emlkeztet: C nyelvben egy kifejezs rtke hamis ha nullval egyenl. Minden ms esetben igaz a kifejezs rtke. A C++ -ban az igaz rtk a true a hamis a false rtknek felel meg. Mivel nagyon sok program mg mindig a C konvencit hasznlja, ezrt a fordt az integer rtket bool tpusv konvertlja. Nzznk egy nagyon egyszer pldt: #include using namespace std; int main() { bool felt; int a; felt = false; if(felt) // ez hamis lesz a = 1; else a = 2; // ez a rsz hajtdik vgre cout

  • struct valami { int a; double d; char string[80]; }; Ezt a struktrt egyszeren hasznlhatjuk a C++ -ban: valami what; what.d = 3.1415; Ennek a szintaktikai elemnek mg lesz jelentsge az objektum-orientlt programozs sorn.

    2.3 Mutatk, pointerek Nzznk egy pldt, mely kinyomtatja tbb vltoz s egy fggvny cmt. (Ez azrt lehetsges, mivel minden program rszlet a memriban van s gy van cme.) #include using namespace std; int dog, cat, bird, fish; void f(int pet) { cout

  • f(): 4198875 dog: 4683580 cat: 4683576 bird: 4683588 fish: 4683592 i: 1245052 j: 1245048 k: 1245044 Lthat hogy az egy helyen deklarlt vltozk cme kzel kerl egymshoz. Br C programozsi nyelvbl ismert, rdemes tismtelni, hogy a fggvnyek kztti paramter tads rtk szerint trtnik. Ezt mutatja be a kvetkez plda, melynl lthat, hogy az f fggvnyen belli vltozs nem tkrzdik a main fggvny vltoziban, hiszen az f fggvny minden vltozja loklis s nem hivatkoznak kls vltozkra. #include using namespace std; void f(int a) { cout
  • #include using namespace std; void f(int *a) { cout
  • cout
  • return 0; }

    2.6 C-ben rt fggvnyek hasznlata Arra is lehetsg van hogy olyan fggvnyeket hasznljunk, melyet valaki a C programozsi nyelvben rt meg, s egy C fordtval s linkerrel egy knyvtrr szerkesztett.

    2.6.1 A cplusplus makr Elszr is minden C++ fordt mely kveti az ANSI/ISO szabvnyt definilja a __cplusplus szimblumot. Ez lnyegben azt jelenti, mintha minden forrs file legtetejn az albbi makr definci llna: #define __cplusplus

    2.6.2 A fggvnyek deklarlsa A C programozsi nyelvben rt fggvnyek esetn (melyet C++ -ban is szeretnnk hasznlni) deklarlni kell hogy C fggvnyrl van sz, pldul: extern "C" void *xmalloc(unsigned size); A deklarci teljesen azonos a C nyelvben megszokott defincival, de el kell rni az extern "C" kifejezst. Ha tbb deklarcit szeretnnk egybe fogni, a kvetkez hasznlhat: extern "C" { #include int *fvg(int a); } Br ez a kt mdszer hasznlhat, de van egy ennl elterjedtebb mdszer.

    2.6.3 C s C++ include file-ok Ha a __cplusplus makrt s az extern "C" kifejezst egytt hasznljuk olyan include, header file-okat hozhatunk ltre melyek hasznlhatk a C s a C++ programozsi nyelvben is. Egy ilyen include file szerkezete a kvetkez szokott lenni:

    Forrs: http://www.doksi.hu

  • #ifdef __cplusplus extern "C" { #endif // a fggvnyek s vltozk ide jnnek, pldul: void *xmalloc(unsigned size); #ifdef __cplusplus } #endif Figyeljk meg, hogy a feltteles fordtsi direktvk segtsgvel hogyan ellenrizzk hogy C vagy C++ tpus fordtsra van-e szksg. A szabvnyos include file-ok, pldul az stdio.h is ilyen mdon van megszerkesztve s ezrt hasznlhat mind a kt nyelvben!

    2.7 Fggvny definils C++ -ban Az emberi kommunikciban egy sznak gyakran tbb jelentse van. Ugyanakkor a programozsi nyelvekben egy fggvnynek vagy tevkenysgnek nevet kell adni, s csak egy neve lehet. Ez sajnos problmhoz vezethet. Pldul ha hrom klnbz tpus vltoznk van s ezeket ki akarjuk nyomtatni ltalunk definilt fggvnyekkel, akkor hrom klnbz fggvnyt kell deklarlni a C nyelvben, pldul: print_int, print_char, print_double. Ugyanakkor mind a hrom fggvny ugyanazt csinlja ezrt szeretnnk elkerlni, hogy hrom fggvny nevet kelljen megjegyezni s azt szeretnnk, hogy csak egy fggvny nevet kelljen megjegyezni. Ennek a problmnak a megoldsra vezettk be a function overloading, fggvny overloading lehetsgt a C++ -ban. (A kifejezst szoktk fggvny tlterhelsnek is fordtani, de szerintem ez nem teljesen fedi a jelentst. Ezrt inkbb az overloading angol szt fogom hasznlni, mint magyar kifejezst.) Az overloading ltalnosan azt jelenti, hogy az adatokon valamilyen operci vgrehajtst vgz szimblumhoz (pldul fggvnyazonosthoz, opertorhoz) tbb, klnbz tpusra vonatkoz klnbz jelentst rendelnk. (Ezt a mondatot olvassuk el tbbszr is s prbljuk meg megrteni!) Hogy egy adott adathoz egy mvelet milyen rtelmezse tartozik, az az adott adat tpustl, vagy pontosabban a fogalmazva az adott fggvny paramter szignatrjtl fgg. A paramter szignatra itt azt jelenti, hogy egy fggvnynek mennyi s milyen tpus paramtere van, illetve a paramterek milyen sorrendben kvetik egymst. Teht attl fggen, hogy egy fggvnyt milyen tpus paramterekkel aktivizlunk, mindig az aktulis paramterekkel megegyez szignatrj fggvnyvltozat hvsnak megfelel kdot generl a C++ fordt. Ebbl is taln lthat, hogy az overloading nem tdefinilst jelent, hiszen amikor az overloading ltal egy szimblumhoz egy jabb jelentst rendelnk az eredeti jelentsek nem vesznek el.

    Forrs: http://www.doksi.hu

  • Nzzk a fenti problmt C++ -ban: #include void show(int val) { printf("Integer: %d\n", val); } void show(double val) { printf("Double: %lf\n", val); } void show(char *val) { printf("String: %s\n", val); } int main() { show(12); show(3.1415); show("Hello World\n!"); } A fenit kdrszletben hrom darab show fggvny van melyek csak a paramtereikben vagy argumentumaikban klnbznek. Fontos megjegyezni, hogy br a forrskdban azonos nevek szerepelnek, de amikor a C++ fordt dolgozik ezekkel a fggvnyekkel, akkor teljesen ms neveket kapnak a fordts s linkels idejre. Azt a folyamatot amely a forrs file-ban szerepl nevet belsleg hasznlatos nvv konvertlja name mangling-nek szoktuk nevezni. Pldul a C++ fordt a fenti pldban a void show(int) fggvnynek a @@showI nevet adja, mg a void show(char *) fggvnynek a @@showCP nevet. (A klnbz C++ fordtk klnbz name mangling eljrst alkalmaznak, de mindegyik valamilyen mdon belekdolja a nvbe a paramter lista tipusait.) Ezek a bels nevek nem klnsebben fontosak a programoz szempontjbl, de azrt fontosak lehetnek pldul ha egy C++ -os fggvny knyvtr tartalmt listzzuk ki.

    2.7.1 Megjegyzsek Ne hasznljuk a fggvny tdefinilst abban az esetben ha kt fggvny teljesen

    klnbz dolgokat csinl. A fenti pldban a klnbz show fggvnyek nagyon hasonlak voltak.

    A C++ azt nem engedi meg hogy kt fggvny csak a visszatrsi rtk tpusban klnbzzn! Ennek az oka a kvetkez, pldul:

    printf(Hello World\n);

    Forrs: http://www.doksi.hu

  • A fenti kdrszlet semmilyen informcit nem ad a visszatrsi rtkrl, hiszen a programoznak nem ktelez figyelembe vennie a visszatrsi rtket. gy ha kt printf fggvny ltezik, melyek csak a visszatrsi rtkkben klnbznek, a fordt nem tudn eldnteni hogy melyiket kell hasznlni.

    A fggvny overloading nha meglephet bennnket. Pldul a fenti plda esetn ha az albbi fggvny hvst hasznljuk

    show(0);

    akkor melyik fggvny hvdik? A nulla lehet egsz szm, vals szm s a NULL pointernek is megfelel. Ebben az esetben az egsz szmot nyomtat fggvnyt hvja meg a C++, de lehet hogy nem ezt vrtuk, vagy nem ezt akartuk.

    2.8 Alap fggvny argumentumok A C++ nyelvben a fggvny overloading-on kvl van mg egy lehetsg mellyel azonos nev, de klnbz argumentum szm fggvnyt lehet hasznlni. Ez a lehetsg az, hogy a fggvnyeknek lehet alap argumentuma. Az alap argumentumot gy lehet megadni, hogy az argumentum alaprtkt a fggvnydeklarciban megadjuk. Pldul: #include void showstring(char *str = "Hello World!\n"); int main() { showstring("Ez egy explicit argumentum.\n"); showstring(); // valjban ez: // showstring("Hello World!\n"); } Ez a lehetsg, hogy bizonyos argumentumokat nem kell megadni a C++ fordt egy knyelmi szolgltatsa, ettl a kd nem lesz rvidebb s nem lesz hatkonyabb. Termszetesen egy fggvnynek tbb alap argumentuma is lehet: void two_ints(int a = 1, int b = 4); int main() { two_ints(); // argumentumok: 1, 4 two_ints(20); // argumentumok: 20, 4 two_ints(20, 5); // argumentumok: 20, 5 }

    Forrs: http://www.doksi.hu

  • Amikor a two_ints fggvnyt hasznljuk, akkor a fordt nulla, egy vagy kt argumentumot ad meg, attl fggen hnyat nem adott meg a programoz. Fontos viszont, hogy a two_ints(,6) kifejezs hibs, argumentumot elhagyni csak a jobb oldalrl lehet! Az alap argumentumokrl a C++ fordtnak tudnia kell, ezrt ltalban a fggvny deklarcinl szoktuk megadni ket. Pldul az include file tartalma: // az include file extern void two_ints(int a = 1, int b = 4); s a hozztartoz implementci: void two_ints(int a, int b) { ... }

    Forrs: http://www.doksi.hu