Prejdi na obsah

C++ triedy

Po dlhej dobe je tu znova nový článok. V dnešnej časti sa pozrieme na triedy. Práve vďaka triedam sa jazyk c++ radi medzi objektovo orientované jazyky. Jeho predchodca, jazyk C bol jedným z najpoužívanejších jazykov. Tento jazyk však využíval štruktúrované programovanie a programy v ňom napísané boli drahé a ťažko sa udržiavali. Objekty v jazyku C++ tento problém vyriešili.

Prečo je dobre vytvárať objekty?

Predstavte si, že vytvárate program pre školu. Do školy chodia žiaci, učia v nej učitelia, upratujú upratovačky. Títo všetci majú svoje meno, vek, plat/priemer a množstvo iných vlastnosti. Bez použitia objektov by boli k dispozícii iba dátové typy ktoré predstavujú celé číslo, znak... Na reprezentáciu všetkých vlastnosti by sme potrebovali obrovské množstvo premenných, ktoré by sa ťažko spracovávali a program by bol značne komplikovaný. Je jednoduchšie vytvoriť nové dátové typy, ktoré reprezentujú triedy, učiteľov, žiakov a ich vlastnosti (vek, meno...), ako používať bežné dátové typy. Tieto nové dátové typy vytvoríme práve pomocou tried. Okrem vlastnosti, ktoré sa nazývajú členské premenné, alebo dátové členy môžeme umiestniť do tried aj funkcie. Napríklad žiakom funkcie chod(), pis(), uc_sa()... Tieto funkcie nazývame členské funkcie.

Deklarácia triedy:

Triedu tvorí skupina premenných rôznych typov a zbierka funkcií, ktoré súvisia s touto triedou. Na vytvorenie triedy používame kľúčové slovo class, za ktorým do zložených zátvoriek zapíšeme zoznam členských premenných a funkcii.

  1. class ziak
  2. {unsigned short vek;
  3. void chod();
  4. };

Public, private

Tieto dve kľúčové slova určujú to, z ktorého miesta programu bude možné k členom triedy pristupovať. Ak pri deklarácii triedy neuvediete inak, budú všetky členské premené a funkcie privátne (súkromné) a pristupovať k nim budú môcť len členy triedy.

Kľúčové slovo public spôsobí, že bude možné k členom pristupovať z hociktorej časti programu.

Práca s členmi triedy

K členským premenným a funkciám môžeme pristupovať pomocou operátora bodka (.).

  1. ziak Jano;
  2. Jano.vek = 14;
  3. Jano.chod();

Pred tým ako použijeme niektorú z členských funkcii, musíme ju definovať a to tak, že uvedieme návratový typ funkcie, názov triedy dve dvojbodky a následne názov funkcie s parametrami. Všetko, čo sme sa doteraz naučili je zhrnuté v nasledujúcom krátkom príklade:

  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. //vytvorenie triedy žiak
  7. class ziak
  8. {public:
  9. unsigned short vek;
  10. double priemer;
  11. void chod();
  12. };
  13. //definícia členskej funkcie chod()
  14. void ziak::chod()
  15. {cout<<"idem\n";
  16. }
  17.  
  18. int main(int argc, char *argv[])
  19. {
  20. ziak Jano;
  21. Jano.vek = 14;
  22. Jano.chod();
  23.  
  24. system("PAUSE");
  25. return EXIT_SUCCESS;
  26. }

Skúste v deklarácii triedy zmazať slovo public. Kompilátor vám počas kompilácie vyhodí chybu: „9 *****\main.cpp `short unsigned int ziak::vek' is private „ (Dev-C++).

Prístupové funkcie

Použitím týchto funkcii môžete zamedziť náhodnej zmene členských premenných, a to tak, že ich spravíte súkromnými a pristupovať k ním budete pomocou verejných funkcii.

  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. //vytvorenie triedy ziak
  7. class ziak
  8. {
  9. private:
  10. unsigned short vek;
  11. double priemer;
  12. public:
  13. unsigned short ZistiVek();
  14. double ZistiPriemer();
  15. void NastavVek( unsigned short NVek);
  16. void NastavPriemer( double NPriemer);
  17. };
  18.  
  19. unsigned short ziak::ZistiVek()
  20. {return vek;}
  21. double ziak::ZistiPriemer()
  22. {return priemer;}
  23. void ziak::NastavVek(unsigned short NVek)
  24. {vek=NVek;}
  25. void ziak::NastavPriemer(double NPriemer)
  26. {priemer=NPriemer;}
  27.  
  28.  
  29. int main(int argc, char *argv[])
  30. {
  31. ziak Jano;
  32. Jano.NastavVek(15);
  33. Jano.NastavPriemer(1.5);
  34. cout<<"Janov vek: "<<Jano.ZistiVek();
  35. cout<<"\nJanov priemer: "<<Jano.ZistiPriemer();
  36. cout<<"\n....po roku....";
  37. Jano.NastavVek(Jano.ZistiVek()+1);
  38. Jano.NastavPriemer(2.2);
  39. cout<<"\nJanov vek: "<<Jano.ZistiVek();
  40. cout<<"\nJanov priemer: "<<Jano.ZistiPriemer()<<endl;
  41. system("PAUSE");
  42. return EXIT_SUCCESS;
  43. }

Konštruktor a deštruktor

Niekedy potrebujete pri vytvorení objektu niečo vykonať napr.: nastaviť hodnoty premenných a pri zničení objektu napríklad vypísať text. Konštruktor je funkcia, ktorá sa volá vždy pri vytvorení a deštruktor vždy pri zániku objektu. Keď si nedefinujete vlastný konštruktor, kompilátor to urobí za vás. Niekedy však práve tieto dve funkcie použijeme. Konštruktor je vždy funkcia bez návratovej hodnoty s rovnakým názvom ako je názov triedy. Deštruktor je taktiež funkcia beznávratového typu s rovnakým názvom, ibaže je pred týmto názvom znak ~ (pravy alt+1). Na nasledujúcom príklade uvidíte kedy sa ktorá funkcia volá.

  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. class ukazka //deklarácia ukážkovej triedy
  7. {public:
  8. ukazka(); //konštruktor
  9. ~ukazka(); //deštruktor
  10. }
  11. ;
  12. ukazka::ukazka()
  13. {cout<<"konstruktor\n";}
  14.  
  15. ukazka::~ukazka()
  16. {cout<<"destruktor\n";}
  17.  
  18. void docasna() //vytvorenie funkcie, v ktorej bude existovať objekt typu ukážka
  19. {ukazka prva;
  20. cout<<"existencia objektu prva\n";}
  21.  
  22. int main(int argc, char *argv[])
  23. { docasna(); //zavolanie funkcie ktorá, dočasne vytvorí objekt typu ukážka
  24. system("PAUSE");
  25. return EXIT_SUCCESS;
  26. }

Funkcia docasna() v sebe vytvorí objekt typu ukazka. Tento objekt však existuje iba počas behu tejto funkcie. Potom sa objekt odstráni. Vyskúšajte si tento program spustiť a z výstupu zistite, kedy sa ktorá funkcia volá.

Konštruktorov môžeme vytvoriť aj viac s rovnakým názvom, ale rôznymi parametrami. Kompilátor si potom vyberie ten, ktorý vyhovuje. V záverečnom príklade sa vrátime ku triede žiak a využijeme všetko čo sme si dneska ukázali.

  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. //vytvorenie triedy žiak
  7. class ziak
  8. {
  9. private:
  10. unsigned short vek;
  11. double priemer;
  12. public:
  13. ziak(); //3 konštruktory s rôznymyi parametrami.
  14. ziak(unsigned short NVek);
  15. ziak(unsigned short NVek, double NPriemer);
  16. unsigned short ZistiVek();
  17. double ZistiPriemer();
  18. void NastavVek( unsigned short NVek);
  19. void NastavPriemer( double NPriemer);
  20. };
  21.  
  22. unsigned short ziak::ZistiVek()
  23. {return vek;}
  24. double ziak::ZistiPriemer()
  25. {return priemer;}
  26. void ziak::NastavVek(unsigned short NVek)
  27. {vek=NVek;}
  28. void ziak::NastavPriemer(double NPriemer)
  29. {priemer=NPriemer;}
  30.  
  31. //konštruktory
  32. ziak::ziak()
  33. {vek = 0;
  34. priemer = 0;}
  35. ziak::ziak(unsigned short NVek)
  36. {vek = NVek;
  37. priemer = 0;}
  38. ziak::ziak(unsigned short NVek, double NPriemer)
  39. {vek = NVek;
  40. priemer = NPriemer;}
  41.  
  42.  
  43. int main(int argc, char *argv[])
  44. {
  45. ziak Jano; //o každom žiakovi zadáme iné informácie - kompilátor zvoli iný konštruktor
  46. ziak Fero(14);
  47. ziak Juro(16,2.3);
  48. cout<<"Janov vek: "<<Jano.ZistiVek()<<endl;
  49. cout<<"Janov priemer: "<<Jano.ZistiPriemer()<<endl;
  50. cout<<"Ferov vek: "<<Fero.ZistiVek()<<endl;
  51. cout<<"Ferov priemer: "<<Fero.ZistiPriemer()<<endl;
  52. cout<<"Jurov vek: "<<Juro.ZistiVek()<<endl;
  53. cout<<"Jurov priemer: "<<Juro.ZistiPriemer()<<endl;
  54. system("PAUSE");
  55. return EXIT_SUCCESS;
  56. }

To by bolo pre dnešok všetko. Dúfam, že sa vám tento článok páčil a teším sa na ohlasy. Ako kladné tak aj záporne.

Povedz o článku aj ostatným - www.pridej.cz

pokracovanie?

Dobry den...paci sa mi tento serial o programovani v C++ (dokonca ma to natolko zaujalo ze som si skusal nieco "napisat":)..mam len jednu otazku..kedy bude pokracovanie?.:))..

Pokračovanie?

Prave sa piše... akurat sa idem do toho pustiť, takže napišem dneska, zajtra, potom ešte dako opraviť gramatiku a v sobotu/ nedelu bude dalsie. Som rad, ze sa ludom paci moj serial. keby ste mali akekolvek otazky nevahajte ma kontaktovať. Moj e-mail je satala(a)centrum.sk

Prihlásenie

Nové komentáre