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.

Podobne dokumenty