of 29 /29
C++ wykład 2 (28.02.2013) Klasy i obiekty

C++ wykład 2 (28.02.2013)

Embed Size (px)

DESCRIPTION

C++ wykład 2 (28.02.2013). Klasy i obiekty. Spis treści. Pojęcie klasy i obiektu Składowe w klasie – pola i metody Konstruktor i destruktor Wskaźnik this Ukrywanie składowych Przeciążanie nazw funkcji Argument będący referencją do stałej Pola stałe i ulotne Konstruktor kopiujący - PowerPoint PPT Presentation

Text of C++ wykład 2 (28.02.2013)

  • C++wykad 2 (28.02.2013)Klasy i obiekty

  • Spis treciPojcie klasy i obiektuSkadowe w klasie pola i metodyKonstruktor i destruktorWskanik thisUkrywanie skadowychPrzecianie nazw funkcjiArgument bdcy referencj do staejPola stae i ulotneKonstruktor kopiujcyPola zawsze modyfikowalne

  • KlasyKlasa to typ zdefiniowany przez programist.Program to zbir deklaracji i definicji klas.Klasa jest modelem (projektem) a obiekt jest instancj klasy (realizacj projektu).Klasa posiada rne pola i metody:wartoci pl w obiekcie okrelaj stan obiektu,metody determinuj funkcjonalno obiektu.

  • KlasyKlas definiuje si nastpujco: class klasa { // definicje pl // deklaracje metod };Po zrobieniu definicji mona tworzy obiekty klasy: klasa x, y, z;Moemy te tworzy wskaniki, referencje i tablice obiektw danej klasy: klasa *wsk = &x; klasa &ref = y; klasa *&r2w = wsk; klasa tab[10];

  • KlasyPrzykad definicji klasy (w pliku nagwkowym .hpp): class Punkt { private: double x, y; public: Punkt (double a, double b); ~Punkt (); void przesun_x (double dx); void przesun_y (double dy); double wsp_x (); double wsp_y (); double odleglosc (Punkt &p); };

  • ObiektyMona utworzy obiekt na stosie za pomoc zwykej deklaracji poczonej z inicjalizacj.Przykad obiektu automatycznego: Punkt a = Punkt(4,6); Punkt b(5,7);Mona te utworzy obiekt na stercie za pomoc operatora new. Pamitaj o usuniciu go operatorem delete, gdy bdzie niepotrzebny.Przykad obiektu w pamici wolnej: Punkt *p = new Punkt(-2,-3); // delete p;

  • Skadowe w klasieWewntrz klasy mona zdefiniowa pola skadowe (podobnie jak zmienne) oraz zadeklarowa funkcje skadowe (podobnie jak funkcje globalne).Kady obiekt ma wasny zestaw pl skadowych. Wartoci pl skadowych w obiekcie wyznaczaj jego stan.Funkcje skadowe okrelaj funkcjonalno klasy. Za pomoc funkcji skadowych mona sterowa stanem obiektw i ich zachowaniem.

  • Skadowe w klasieProgramowanie obiektowe to paradygmat programowania, w ktrym programy definiuje si za pomoc obiektw elementw czcych stan (czyli dane, nazywane najczciej polami) i zachowanie (czyli funkcje skadowe, nazywane te metodami). Abstarkcja to cecha programowania obiektowego kady obiekt w systemie jest modelem abstrakcyjnego wykonawcy, ktry moe wykonywa prac, opisywa i zmienia swj stan oraz komunikowa si z innymi obiektami bez ujawniania, w jaki sposb zaimplementowano jego cechy. Hermetyzacja (nazywana te enkapsulacj) to zamknicie w obiekcie danych i funkcji skadowych do operowania na tych danych. Hermetyzacja to rwnie ukrywanie implementacji zapewnia, e obiekt nie moe zmienia stanu wewntrznego innych obiektw w nieoczekiwany sposb (tylko wasne metody obiektu s uprawnione do zmiany jego stanu). Kady typ obiektu prezentuje innym obiektom swj interfejs, ktry okrela dopuszczalne metody wsppracy.

  • Skadowe w klasieDo skadowych w obiekcie odwoujemy si za pomoc operatora dostpu do skadowych (kropka . dla obiektw i referencji albo strzaka -> dla wskanikw).Metoda jest wywoywana na rzecz konkretnego jednego obiektu.Przykady odwoania do skadowych w obiekcie: Punkt a(17,23), b(20,19); Punkt *p = &a, &r = b; double d = a.odleglosc(b); r.przesun_y(8); p->przesun_x(6);

  • Pola skadowePola w klasie mog by danymi typu podstawowego (bool, char, int, double, itd), ale mog te by obiektami innych klas.Przyady: struct Lwymierna { int licznik, mianownik; }; struct Osoba { int rok_ur; double waga, wzrost; string imie, nazwisko; };Budowanie nowej klasy w oparciu o obiekty innych klas nazywa si kompozycj.

  • Funkcje skadoweFunkcje skadowe w klasie tylko deklarujemy (jak funkcje globalne w plikach nagwkowych).Definicje metod umieszczamy poza klas (definicje te s kwalifikowane nazw kasy za pomoc operatora zakresu ::). Przykad definicji metod poza klas (w pliku rdowym .cpp): void Punkt::przesun_x (double dx) { x += dx; } void Punkt::przesun_y (double dy) { y += dy; } double Punkt::wsp_x () { return x; } double Punkt::wsp_y () { return y; } double Punkt::odleglosc (Punkt &p) { double dx=x-p.x, dy=y-p.y; return sqrt(dx*dx+dy*dy); }W ciele metody moemy si odnosi do wszystkich skadowych w tej samej klasie bez operatora zakresu ::.

  • KonstruktorKonstruktor to specjalna metoda uruchamiana tylko podczas inicjalizacji obiektu jego celem jest nadanie pocztkowego stanu obiektowi.Konstruktor ma tak sam nazw jak klasa.Konstruktor nie zwraca adnego wyniku.Przykad konstruktora: Punkt::Punkt (double a, double b) { x = a, y = b; }Jeli programista nie zdefiniuje adnego konstruktora w klasie, wwczas kompilator wygeneruje konstruktor domylny (konstruktor bezargumentowy), ktry nic nie robi.Przykad konstruktora domylnego zdefiniowanego jawnie: Punkt::Punkt () { x = y = 0; }Deklaracja obiektu z konstruktorem domylnym: // Punkt p(); - to jest le! Punkt p = Punkt(); // to samo co; Punkt p;

  • DestruktorDestruktor to specjalna metoda uruchamiana podczas likwidacji obiektu jego celem jest posprztanie po obiekcie (zwolnienie jego zasobw pami na stercie, pliki, itp.).Nazwa destruktora to nazwa klasy poprzedzona tyld.Destruktor nie zwraca adnego wyniku.Destruktor nie przyjmuje adnych argumentw.Przykad destruktora: Punkt::~Punkt () { x = y = 0; }Destruktor mona wywoa jawnie w czasie ycia obiektu tak jak zwyk funkcj skadow: Punkt p(1,2); Punkt *pp = &p; // p.~Punkt(); pp->~Punkt();Destruktora nie powinno si wywoywa w sposb jawny.

  • Wskanik thisWskanik this pokazuje na biecy obiekt.Wskanika tego uywany tylko w funkcjach skadowych.Typ wskanika this jest taki jak klasy, w ktrej jest uywany.this stosujemy najczciej w przypadku:zasonicia nazwy skadowej przez nazw lokaln (na przykad przez nazw argumentu);jawnego wywoania destruktora ( this->~Klasa(); ).

  • Ukrywanie skadowychCa definicj klasy mona podzieli na bloki o rnych zakresach widocznoci.Pocztek bloku rozpoczyna si od frazy public:, private: albo protected:.Skadowe publiczne (blok public:) s widoczne w klasie i poza klas. Skadowe prywatne (blok private:) s widoczne tylko w klasie (rwnie w zewntrznej definicji funkcji skadowej danej klasy). Skadowe chronione (blok protected:) s widoczne tylko w klasie i w klasach pochodnych od danej klasy.

  • Ukrywanie skadowychDomylnie wszystkie skadowe w klasie s prywatne a w strukturze publiczne. Ukrywamy informacje wraliwe, by kto spoza klasy przypadkiem nie zniszczy stanu obiektu.Dobrym obyczajem w programowaniu jest ukrywanie pl skadowych, do ktrych dostp jest tylko poprzez specjalne funkcje skadowe (zwane metodami dostpowymi albo akcesorami gettery do czytania i settery do pisania).

  • Przecianie nazw funkcjiPrzecianie albo przeadowanie nazwy funkcji polega na zdefiniowaniu kilku funkcji o takiej samej nazwie.Funkcje przecione musz si rni list argumentw kompilator rozpoznaje po argumentach, o ktr wersj danej funkcji chodzi.Moemy przecia rwnie funkcje skadowe i konstruktory w klasie.Przykad przecienia konstruktora: class Punkt { double x, y; public: Punkt () { x = y = 0; } Punkt (double x, double y) { this->x = x; this->y = y; } }

  • Zmienne staeModyfikator const oznacza stao (brak zmian) zmiennych albo argumentw funkcji.Stae trzeba zainicjalizowa.Przykad definicji staej: const double pi = 3.1415926535897932386426433832795;W programie niewolno modyfikowa wartoci zmiennych ustalonych (poprzez przypisanie nowych wartoci).Zmienne o ustalonej wartoci to przewanie stae globalne.Pola stae bardzo czsto s deklarowane w klasie jako pola publiczne.

  • Argumenty staeModyfikator const moe wystpowa przy argumentach w funkcji.Jeli argument jest stay to argumentu takiego nie wolno w funkcji zmodyfikowa.Argumentami staymi s najczciej argumenty przekazywane przez referencje.Przykad funkcji z argumentami staymi: int min (const int &a, const int &b) { return a
  • Stae kontra #defineRozwamy nastpujce definicje:# define E 2.718281828459const double E = 2.718281828459;W przypadku makrodefinicji nazwa E jest kompilatorowi zupenie nieznana (bdzie usunita w fazie preprocesingu).Nazwa E w przypadku staej ma swj zakres wanoci.Staa E to obiekt w pamici i ma swj adres.Staa E to obiekt o okrelonym typie.

  • Referencja do staej jako argument w funkcjiReferencja do staej moe si odnosi do obiektu zewntrznego (moe by zadeklarowany jako stay) ale rwnie do obiektu tymczasowego.Przykad referencji do staej: const int &rc = (2*3-5)/7+11;Przykad argumentu funkcji, ktry jest referencj do staej: int fun (const int &r); // wywoanie moe mie posta // fun(13+17); // gdzie argumentem moe by wyraenie

  • Konstruktor kopiujcyKonstruktor kopiujcy suy do utworzenia obiektu, ktry bdzie kopi innego ju istniejcego obiektu.Konstruktorem kopiujcym jest konstruktor w klasie Klasa, ktry mona wywoa z jednym argumentem typu: Klasa::Klasa (Klasa &); Klasa::Klasa (const Klasa &);Wywoanie konstruktora moe nastpi:w sposb jawny: Klasa wzor; // Klasa nowy = wzor;niejawnie, gdy wywoujemy funkcj z argumentem danej klasy przekazywanym przez warto;niejawnie, gdy wywoana funkcja zwraca warto w postaci obiektu danej klasy.Jeli programista nie zdefiniuje konstruktora kopiujcego to moe wygenerowa go kompilator (wtedy wszystkie pola s kopiowane za pomoc operatora przypisania).

  • Stay wskanik i wskanik do staejWskanik do staej pokazuje na obiekt, ktrego nie mona modyfikowa. Przykad: int a=7, b=5; const int *p = &a; // *p = 12; to jest bd p = &b; // okStay wskanik zawsze pokazuje na ten sam obiekt. Przykad: int a=13, b=11; int *const p = &a; *p = 12; // ok // p = &b; to jest bdMona rwnie zdefiniowa stay wskanik do staej. Przykad: int c=23; const int *const p = &c;

  • Pola stae w klasieW klasie mona zdefiniowa pola stae z deklaratorem const. Przykad: class Zakres { const int MIN, MAX; public: Zakres(int m); // };Inicjalizacji pola staego (i nie tylko staego) mona dokona tylko poprzez list inicjalizacyjn w konstruktorze (po dwukropku za nagwkiem). Przykad: Zakres :: Zakres(int mi, int ma) : MIN(mi), MAX(ma) { if (MIN=MAX) throw string("ze zakresy"); } Inicjalizacja pl na licie ma posta konstruktorow.Konstruktor kopiujcy nie zostanie wygenerowany automatycznie tylko wtedy, gdy w klasie nie ma pl staych.

  • Stae funkcje skadoweW klasie mona zadeklarowa stae funkcje skadowe z deklaratorem const. Przykad: class Zakres { const int MIN, MAX; public: int min () const; int max () const; // };Staa funkcja skadowa gwarantuje nam, e nie bdzie modyfikowa adnych pl w obiekcie (nie zmieni stanu obiektu). Przykad: int Zakres::min () const { return MIN; } int Zakres::max () const { return MAX; }Na obiektach staych moemy dziaa tylko staymi funkcjami skadowymi.

  • Ulotne funkcje skadoweW klasie mona rwnie zadeklarowa ulotne funkcje skadowe z deklaratorem volatile. Przykad: class Licznik { volatile int ile; public: int ilosc () volatile; // };Ulotna funkcja skadowa gwarantuje nam, e nie bdzie optymalizowa kodu przy korzystaniu z pl w obiekcie (nie przechowywa stanu obiektu w podrcznej pamici). Przykad: int Licznik::ilosc () volatile { return ile; }Na obiektach ulotnych moemy dziaa tylko ulotnymi funkcjami skadowymi.

  • Pola zawsze modyfikowalneJeli obiekt zostanie zadeklarowany jako stay, to mona na nim wywoywa tylko stae funkcje skadowe, ktre nie zmieniaj stanu obiektu.W klasie mona jednak zdefiniowa zawsze modyfikowalne pola skadowe za pomoc deklaratora mutable. Przykad: class Zakres { mutable int wsp; public: void nowyWsp (int w) const; // };Pole zawsze modyfikowalne moe by zmieniane w staym obiekcie przez sta funkcj skadow. Przykad: void Zakres::nowyWsp (int w) const { if (w
  • Zgaszanie bdw poprzez wyjtkiJeli w czasie dziaania programu miaoby doj do powstania nieakceptowalnego stanu obiektu, to naley zgosi bd.Bdy zgaszamy za pomoc systemu wyjtkw instrukcj throw. Przykad: if (warunek) throw string(komunikat);Na razie wyjtkami bd obiekty typu string. Zgoszenie wyjtku bez jego wyapania spowoduje zakoczenie dziaania programu.Wyjtek zgoszony w konstruktorze spowoduje, e obiekt nie zostanie utworzony.

  • Obiekty na stercieProgramista moe utworzy obiekt na stercie operatorem new.Za operatorem new stoi konstruktor wybranej klasy utworzony obiekt bdzie zawsze zainicjalizowany (o ile dziaanie konstruktora nie przerwie wyjtek).Operator new zwraca wskanik do obiektu takiej klasy jaki jest tworzony konstruktorem.Pami przydzielon obiektowi naley zwolni operatorem delete.Argumentem operatora delete jest wskanik do obiektu na stercie przed zwolnieniem pamici obiektu zostanie automatycznie wywoany destruktor.W destruktorze nie zgaszamy adnych wyjtkw.