C++ mgr inż. Tomasz Turba Politechnika Opolska 2016
Zajęcia [ ] Klasy i obiekty Korzystanie Prawa dostępu Metody Korzystanie i statyka Konstruktor / destruktor ->THIS!<- Zadanie domowe
Klasa Klasa = lepsza organizacja kodu złożonego z typów, zmiennych, funkcji, etc. Klasa jest jak pudełko w którym zamykamy składowe Klasa ~~ struktura = TYP DANYCH Definicja: class NAZWA_KLASY { //typy, instrukcje } ; Użycie: NAZWA_KLASY nazwa_zmiennej; //znajomy widok? == OBIEKT!
Korzystanie z klasy Różnicą względem struktury jest prawo dostępu! (domyślnie – PRIVATE!) PRIVATE zmienne i funkcje tylko do użycia w klasie PROTECTED zmienne dziedziczone do innej klasy PUBLIC dostęp do składowych klasy z dowolnego miejsca kodu
#include class NAZWA_KLASY { int prywatne1; //domyślny PRIVATE public: //w dół PUBLIC int publiczne1; int publiczne2; protected: //w dół PROTECTED int chronione1; int chronione2; private: int prywatne2; public: int publiczne3; protected: int chronione3, chronione4; }; int main() { NAZWA_KLASY obiekt; obiekt.publiczne1 = 1; //GIT! obiekt.chronione1 = 1; //BŁĄD obiekt.prywatne1 = 1; //BŁĄD }
Metoda Metoda = funkcja w klasie (powiązana z klasą) Obowiązują uprawnienia! Definicja: class NAZWA_KLASY { void metodaprv(); //deklaracja w klasie public: int metodapub(int x) //definicja w klasie { return x; } }; Wywołanie metody: NAZWA_KLASY obiekt; obiekt.metodapub(1); obiekt.metodaprv(); //BŁĄD!
#include class Klasa { int MojInt; public: void Set(int n); int Get(); }; void Klasa::Set(int n) { MojInt = n; } int Klasa::Get() //wywołanie poza klasą { return MojInt; } int main() { Klasa k; k.Set(5); std::cout << k.Get(); }
Zmienne i metody statyczne #include class Klasa { static int wspolne; public: void metoda() { std::cout << wspolne << std::endl; ++wspolne; } }; int Klasa::wspolne = 0; int main() { Klasa a, b, c; a.metoda(); b.metoda(); c.metoda(); b.metoda(); a.metoda(); c.metoda(); }
Konstruktor Konstruktor = funkcja w klasie (metoda), zawsze tworzona (nawet niejawnie) Musi mieć nazwę identyczną jak nazwa klasy; nie może nic zwracać (!) Chcemy aby każdy obiekt klasy Miesiąc po jej utworzeniu generował tablicę dni tygodnia w zależności od miesiąca i roku Klasycznie: class Miesiac { public: int dni[31]; int liczbaDni; string nazwa; Miesiac(int numer, int rok);//deklaracja konstruktora }; Miesiac::Miesiac(int numer, int rok)//definicja konstruktora { // instrukcje … }
Tworzenie konstruktora Klasycznie: Miesiac styczen2000(1, 2000); Wskaźnikowo: Miesiac* styczen2000 = new Miesiac(1, 2000); Instrukcje inicjujące: Rok() : miesiace(new Miesiac[12]), liczbaDni(7) { instrukcje… } Kopiująco (referencja na stały obiekt): Miesiac miesiac(12, 2005); Miesiac kopia(miesiac);
Destruktor Zniszczenie konstruktora, dealokacja pamięci z obiektów, klas There can be only one! class Klasa { Klasa(); //konstruktor ~Klasa();//destruktor };
#include class Test { public: Test() { std::cout << "Konstruktor" << std::endl; } Test( const Test & ) { std::cout << "Konstruktor kopiujacy" << std::endl; } ~Test() { std::cout << "Destruktor" << std::endl; } }; int main() { { Test t; } std::cout << "---" << std::endl; { Test t1; Test t2 = t1; } }
This -> Wskazanie na obiekt dla którego została wywowałana metoda (nie dotyczy statycznych metod!) #include class Klasa { public: void Metoda() { std::cout << „O to adres: " << this; } };
This -> #2 class Klasa { int x; public: void Metoda(int x) { this->x = x; //Do x z klasy przypisujemy argument x } }; Uzupełnij kodem z góry i dołu.
Zadanie domowe Przerób program strukturalny (zad. 5) na w pełni obiektowy program klasowy [5pkt] Podpowiedź: podpowiedz.cpp © c0x.pl – proszę przeanalizować i zmodyfikować. Obowiązują te same „funkcje” – sortowania BEZ OBSŁUGI PLIKOWEJ (chyba, że ktoś chce być pr0 +1pkt)