Podstawowe informacje o klasach w c++.docx

(16 KB) Pobierz

Podstawowe informacje o klasach w c++

 

1. Co to jest Klasa?

Klasa jest podstawowym blokiem programu zorientowanego obiektowo. "Klasa" definiuje nowy typ danych, w znacznym stopniu tak jak "struktura" w języku C. W informatyce typ danych oznacza zbiór stanów oraz zbiór operacji dokonujących przejść między tymi stanami. Na przykład int jest typem danych, ponieważ zawiera on zbiór stanów (czyli zbiór wszystkich wartości, jakie zmienna typu int może przyjmować) oraz zbiór operacji takich jak i + j , i++, itd. Dokładnie tak samo "klasa" zawiera zbiór operacji (na ogół "publicznych") oraz zbiór danych (przeważnie "prywatnych") reprezentujących różne, abstrakcyjne wartości, które obiekty tej klasy mogą przyjmować.
Zgodnie z powyższym można to tak ująć, że int jest "klasą" zawierającą funkcje o nazwach w stylu operator++, operator—- itd. Najprościej mówiąc, klasa jest to grupa danych i funkcji, które na tych danych operują. Tworząc klasę tworzymy nowy typ danych, którego składnikami są inne typy danych.

2. Definiowanie klasy

Ogólny szablon definiowania klasy wyglada tak:

class nazwa_klasy { ... // dane i funkcje składowe ; };

a klasa zawierajaca dane osobowe nastepujaco:

class osoba { char imie[20]; char nazwisko[30]; int wiek; };

Definicja klasy kończy się średnikiem. Powyższa klasa ma tylko dane składowe (dwie tablice typu char i zmienną typu int). Nie posiada ona funkcji składowych. Jak już wyżej zostało napisane, definicja klasy składa się z m.in. z deklaracji zmiennych różnego typu. Trzeba pamiętać, że są to tylko deklaracje, a nie definicje. Zmienne zadeklarowane w definicji klasy zostaną zdefiniowane (czyli zaistnieją w pamięci jako liczby) dopiero gdy stworzymy jakiś obiekt danej klasy. Oznacza to, że w definicji klasy nie można nadawać zmiennym wartości, ponieważ jeszcze nie istnieją.

3. Dostęp do składników klasy

Definiując klasę można ograniczyć dostęp do niektórych składników klasy. Istnieją trzy rodzaje dostępu:
public oznacza, że składniki deklarowane po tej etykiecie są dostępne z każdego miejsca programu,
private oznacza, że składniki deklarowane po tej etykiecie dostępne są tylko dla funkcji składowych tej klasy; funkcje globalne (zwykłe) nie mają dostępu do tych składników, a więc z funkcji main również nie ma dostępu do tych danych,
protectedtak jak w przypadku private z tą tylko różnicą, że dostęp do takich składników mają jeszcze klasy wywodzące się z tej klasy (będzie to wytłumaczone przy dziedziczeniu)] w kodzie programu dostęp do zmiennych wewnątrz klasy (zwanych polami) jest uzależniony od tego czy mamy do czynienia ze zmienną typu klasowego, czy wskaźnikiem na ten obiekt. W pierwszym przypadku dostęp do pól uzyskuje się operatorem wyłuskania, którym jest kropka (.):

obiekt.pole = wartosc;//przypisanie wartości polu w obiekcie

w przypadku wskaźnika operatorem wyłuskania jest strzałka ->

obiekt->pole = wartosc;

4. konstryktory i destruktory

Klasy języka C++ wyposażone są w specjalną funkcję zwaną konstruktorem. Konstruktor jest specjalną funkcją składową, wywoływaną zawsze w chwili tworzenia obiektu danej klasy; Zadaniem konstruktora jest inicjalizacja danych składowych (pól) obiektu danej klasy, przydzielenie pamięci dla jego elementów oraz wykonanie innych czynności niezbędnych do prawidłowego utworzenia obiektu; Konstruktor nie jest obowiązkowym elementem definicji klasy. Jeśli tworząc klasę nie zdefiniujesz jawnie jej konstruktora, kompilator automatycznie wygeneruje tzw. konstruktor domyślny; Rozwiązanie takie, choć dość wygodne, sprawdza się tylko dla bardzo prostych klas; Nazwa konstruktora musi być taka sama, jak nazwa zawierającej go klasy; Konstruktor nie może tez zwracać żadnej wartości Klasa może posiadać więcej niż jeden konstruktor; Jest to możliwe dzięki mechanizmowi przeciążania funkcji
Destruktor jest specjalną funkcją wywoływaną w chwili likwidacji obiektu danej klasy; jest funkcjonalnym przeciwieństwem konstruktora; Do jego zadań należy najczęściej zwalnianie zasobów wykorzystywanych przez obiekt i inne czynności natury porządkowej; Destruktor nie jest obowiązkowym elementem klasy; możesz zdefiniować go tylko raz ; jest on funkcją bezparametrową i nie zwracającą żadnej wartości; Nazwa składa się z nazwy klasy poprzedzonej znakiem ~. Destruktor jest wywoływany w chwili usuwania obiektu danej klasy;

5. Tworzenie obiektu klasy

Zmienna

Zmienną typu klasowego tworzy się w ten sposób:

osoba czlowiek1;

Ta instrukcja tworzy nową instancję klasy osoba i przypisuje ją zmiennej czlowiek1. Czym jest instancja? Jest to kopia wszystkich pól klasy.Podczas tworzenia nowej instancji, tworzone są zmienne będące jej polami, oraz m.in. jest wywoływany jej konstruktor. Przyklad:

int main() { osoba czlowiek1; osoba czlowiek2;//tworzone są dwa obiekty klasy "osoba" czlowiek1.wiek = 20;//przypisanie pól czlowiek2.wiek = 30; cout << "Pierwszy człowiek ma " << czlowiek1.wiek << " lat." << endl; cout << "Drugi człowiek ma " << czlowiek2.wiek << " lat." << endl; }


Na ekranie wyswietli sie:
Pierwszy człowiek ma 20 lat.
Drugi człowiek ma 30 lat.

Wskaźnik

Wskaźnik typu klasowego tworzy się używając operatora new:

osoba* czlowiek1 = new osoba();

taki wskaźnik trzeba przed zakończeniem programu zniszczyć operatorem delete:

delete czlowiek1;

W przeciwnym wypadnu może wystąpić poważny błąd wycieku zasobów.

6. Funkcje w klasach

Wystepowanie funkcji w klasach jest głównym kryterium odróżniającym je od struktur. Oto klasa z dodaną funkcją oraz kwalifikatorem dostępu:

class osoba { public: char imie[20] char nazwisko[30] int wiek; void przedstawSie();//funkcja };

Funkcje z klas definiujemy później według poniższego wzoru (najlepiej po definicji klasy):

typ_zwracany nazwa_klasy::nazwa_funkcji(argumenty) {...}

7. Wskaźnik THIS

Deklaracja każdej klasy zawiera ukryte pole wskaźnikowe o nazwie this; Po utworzeniu obiektu, wskaźnik this zawiera adres obiektu w pamięci; Oto klasa Punkt widziana oczami komputera:

Class Punkt { private: Punkt *this; int x, y; public: Punkt (int _x, int _y); ~Punkt() .... };

Czemu służy wskaźnik this ? Każdy obiekt danej klasy posiada własną kopię zestawu pól. Natomiast funkcje składowe są przechowywane w jednym egzemplarzu; Wskaźnik this pozwala na zidentyfikowanie właściciela danych, do których odwołuje się funkcja składowa; Jeśli chcesz uniknąć kłopotów, nigdy nie zmieniaj wartości wskaźnika this!

Bibliografia:

Wikipedia ;
Jerzy Grabosz "Sympfonia C++"

...
Zgłoś jeśli naruszono regulamin