130 likes | 204 Views
Seminář C++. 3. cvičení Třídy. Ing. Jan Mikulka. Pojem Třída. Třídy slouží ke spojení (zapouzdření) dat a funkcí do jednoho (nového) typu Umožňují předepisovat různá oprávnění k přístupu k jednotlivým prvkům class Priklad { int Hodnota; // soukromé (private)
E N D
Seminář C++ 3. cvičení Třídy Ing. Jan Mikulka
Pojem Třída • Třídy slouží ke spojení (zapouzdření) dat a funkcí do jednoho (nového) typu • Umožňují předepisovat různá oprávnění k přístupu k jednotlivým prvkům class Priklad { int Hodnota; // soukromé (private) public: // veřejné (public) Priklad() // konstruktor {Hodnota=1;}; protected: // chráněné (protected) int treti() { return Hodnota;}; private: // soukromé (private) int Posledni(); };
Systém přidělování práv • deklarace před první specifikací přístupových práv jsou automaticky považovány za soukromé (private) ve třídách class. veřejné (public) ve strukturách struct a unionech union.
Metody • nebo-li členské funkce, funkce součástí třídy • Mohou být deklarovány jako public, protected, private • virtual, inline • Mohou být přetěžovány pouze členskými funkcemi stejné třídy • Mají přístup ke všem prvkům své třídy bez ohledu na přístupová práva • Jsou jediným prostředkem s funkcemi typu friend, jak získat přístup k soukromým prvkům- private. • Metody mohou být deklarovány jak uvnitř, tak vně deklarace třídy • Metody definované uvnitř definice třídy jsou překládány jako inline
Definice metody vně class test { int n; public: test() {n=1;} int Test3Vrat() const {return n;} //definice int Test4Smaz(); //definice }; inline test::Test4Smaz() {n=0;}
Přístup k prvkům třídy class test { private: int n1, n2; int fun1() {return n1*n2;} public: void fun2(int j) { n1=j+1; n2=fun1(); } }; test z; // z je instancí třídy test z.fun2(222); // Změna z.n1 a z.n2
Přetěžování metod class Zaklad { public: void fun1(int); }; class Odvozena:Zaklad { public: void fun1(char*); }; void main() { Odvozena odv; // Případ třídy Odvozena odv.fun1(3); // Chyba odv.Zaklad::fun1(3); // Správně return 0; }
Zvláštní metody - konstruktor • Konstruktor má vždy stejné jméno jako jeho třída • Konstruktor nemá žádnou návratovou hodnotu • Pokud konstruktor nedeklarujeme, překladač v třídě sám vytvoří veřejně přístupný konstruktor bez parametrů • Pokud explicitně deklarujeme jakýkoliv konstruktor, nebude překladač žádný další vytvářet • Konstruktory mohou být přetěžovány • Konstruktory se nedědí, konstruktor potomka automaticky volá konstruktory bezprostředních prvků • Konstruktory, které mají právě jeden parametr, mohou provádět konverzi na typ své třídy • Konstruktor se volá při dynamické alokaci případu pomocí operátoru new
Příklad konstruktoru class test { int privat; public: test(int i){privat=1;} //Konstruktor explicit test(float g) {privat=(int)g;} }; void main() { test pripad(100); test pripad2=100; //Implicitní konverze test pripad3(3.2); test pripad4=3.2; //Chyba: explicitní konverze parametru není return 0; }
Zvláštní metody - destruktor • Destruktory se volají automaticky při zániku případu (například delete – zrušení dynamické proměnné). • Destruktor nemá žádnou návratovou hodnotu • Pokud v třídě nedeklarujeme explicitně destruktor, vytvoří si překladač veřejně přístupný standardní destruktor • Destruktor se nedědí • Destruktor nemá žádné parametry • Destruktory mohou být i virtuální • Destruktory můžeme explicitně volat
Ukazatel this • ukazatel na aktuální instanci class complex { double Re, Im; public: complex(double _Re, double _Im):Re(_Re), Im(_Im){} double Real(); double Imag(); }; double complex::Real(){return Re;} double complex::Imag(){return Im;} V metodě Real() je příkaz return Re vlastně return this->Re
Jak přistupovat k metodám a datům třídy v aplikaci • Jména deklarovaná uvnitř třídy jsou dostupná i mimo třídu když jsou zapsány případem (operátor tečka), ukazatelem na případ (operátor ->), někdy jménem třídy (operátor ::) • objekt. • objekt-> • objekt::
Zadání cvičení • 1. Pomocí tříd sestavte program pro násobení dvou matic A a B • 2. Pomocí tříd sestavte program pro součet dvou matic A a B • program umístěte do samostatného hlavičkového souboru, nakreslete vývojový diagram • použití nového „cout <<“ místo „printf()“ • bodování: funkce (1 bod), rychlost (1 bod), stabilita a délka prog. (1 bod), implementace v hl. souboru (1 bod)