Pojęcie klasy
Transkrypt
Pojęcie klasy
Pojęcie klasy Typ zmiennych informuje: • o ich rozmiarze w pamięci, • jaki rodzaj informacji mogą zawierać, • jakie działania moŜna na nich wykonywać. W C++ dane mogą zostać powiązane z funkcjami - znaczy to, Ŝe kompilator nie dopuści do tego, by do funkcji oczekującej argumentu typu „temperatura" wysłać argument typu „stan_oszczędności". śeby tak było musimy najpierw zdefiniować sobie taki typ. C++ pozwala nam na zdefiniowanie własnego typu danej. Zdefiniowany typ moŜe być „modelem" jakiegoś rzeczywistego obiektu. Rzeczywisty obiekt - np. pralkę automatyczną - moŜna w komputerze opisać zespołem liczb i zachowań. Dla pralki automatycznej te liczby to: - cena, - rok produkcji, - wymiary, - kolor, - wydajność wyraŜona w kilogramach ubrań, którą pralka moŜe prać za jednym razem. - liczba reprezentująca jej stan wewnętrzny opisany przez program prania - liczba opisująca bieŜący etap prania. Składnikiem takiego obiektu jest zbiór róŜnych liczb. Z kolei zachowania pralki automatycznej to zbiór funkcji, które moŜe dla nas wykonać: - pranie, - płukanie, - wirowanie Te funkcje są takŜe składnikiem obiektu typu pralka automatyczna. Powstaje w komputerze nowy typ danej: pralka automatyczna. Mówimy typ dlatego, Ŝe kreujemy nie jeden konkretny obiekt, ale raczej klasę obiektów. Czyli na razie raczej wymyśliliśmy pralkę automatyczną - jeszcze Ŝaden konkretny egzemplarz takiej pralki (obiekt) nie istnieje. Klasa to inaczej mówiąc typ. Tak jak typem jest int, float, ... Aby mieć egzemplarz obiektu typu int o nazwie suma piszemy: int suma; W przypadku typu zdefiniowanego przez programistę równieŜ postępujemy podobnie: nazwa_typu nazwa_zmiennej; np.: pralka A; Definicja klasy: class nasz_typ { public: int nr_programu; float temperatura_prania; char nazwa[80]; }; Skoro mamy typ, to moŜna utworzyć od niego typ pochodny - czyli na przykład wskaźnik do obiektów tego typu: nasz_typ *wsk; czy teŜ na przykład referencję (przezwisko) obiektu takiego typu : nasz_typ obiekcik ;// ten rodzaj deklaracji będzie najczęściej uŜywany nasz_typ & przezw = obiekcik ; Aby odnieść się do składników obiektu moŜemy się posługiwać jedną z poniŜszych notacji: • obiekt.składnik • wskaźnik -> składnik • referencja.składnik pralka czerwona; // definicja egzemplarza obiektu pralka * wskaŜ; // definicja wskaźnika pralka & ruda = czerwona; // definicja referencji Do składnika temperatura_prania w obiekcie czerwona moŜemy odnieść się tak: czerwona.temperatura_prania=60; wskaŜ=&czerwona; wskaŜ->temperatura_prania=60; ruda.temperatura_prania=60; // nazwą obiektu // wskaźnikiem // referencją Dokładamy funkcje do ciała klasy: … // - funkcje składowe void pierz (int program) ; void wiruj (int minuty) ; int krochmalenie (void); … Kilka uwag: − Deklaracje funkcji pomieszane są z deklaracjami danych. − NiezaleŜnie od miejsca zdefiniowania składnika wewnątrz klasy - składnik znany jest w całej definicji klasy. Mówimy, Ŝe nazwy deklarowane w klasie mają zakres waŜności - równy obszarowi całej klasy. − Jeśli zadeklarujesz metodę klasy jako const, obiecujesz w ten sposób, Ŝe metoda ta nie zmieni wartości Ŝadnej ze składowych klasy. Aby zadeklarować metodę w ten sposób, umieść słowo kluczowe const za nawiasami, lecz przed średnikiem. Pokazana poniŜej deklaracja funkcji składowej const o nazwie SomeFunction() nie posiada argumentów i zwraca typ void: void SomeFunction() const; Dostęp do składowych klasy class nasz_typ { // składniki prywatne *********************** private: int liczba;//<—prywatne dam składowe float temperatura; char komunikat[80]; int czy_gotowe();//<—prywatna funkcja składowa // składniki publiczne *********************** public: float prędkość; // <—publiczna dana składowa int zrob_pomiar();// <—publiczna funkcja składowa }; Istnieją etykiety za pomocą, których moŜna określać dostęp do składników klasy. − private: − protected: − public: W definicji klasy składniki dane nie mogą mieć inicjalizatora!!! class paszport { … int wzrost = 176;//!!!!! }; Składnia jest więc taka: nazwa obiektu, potem kropka, a potem nazwa funkcji składowej z ewentualnymi argumentami : obiekt.funkcja(argumenty); Gdzie moŜe być zdefiniowana funkcja składowa? − Definicje Wewnątrz samej definicji klasy. − Definicje są napisane poza ciałem klasy, (operator zakresu „::”) osoba::void zapamiętaj (...)//Błąd ! void osoba::zapamiętaj (...)//OK Zadanie. Napisz klasę trojkat, obliczającą pole trójkąta określonego przez 3 punkty w układzie współrzędnych. W klasie powinny znajdować się następujące pola: • punkt wsp[3];// tablica 3 elementowa typu punkt, będzie to odzielna klasa zadeklarowana wcześniej w programie; • float boki[3]; //zmienna przechowuje długości boków trójkąta; • float obwod; • float pole; Dodatkowo w klasie trojkat mamy następujące metody: • Oblicz funkcja obliczająca pole, • Wynik funkcja wypisująca wynik i długości boków, nie zmienia danych (więc potrzebny const) • Sprawdz funkcja sprawdza czy z podanych punktów moŜna zbudować trójkąt, nie zmienia danych (więc potrzebny const). Klasa punkt Klasa punkt posiada: • float tab[2];// tablica 2-elementowa przechowująca współrzędne (x, y) jednego punktu. oraz metody (funkcje klasy): • Zapisz //funkcja do pobierania danych, W pierwszej wersji programu wszystkie zmienne i metody klas umieścić w części public. W kolejnych wersjach, zmienne klas umieścić w części private.