T: Różnice pomiędzy programowaniem strukturalnym a obiektowym Programowanie C++ T: Różnice pomiędzy programowaniem strukturalnym a obiektowym
Programowanie strukturalne Programowanie strukturalne jest paradygmatem (podstawą, fundamentem) programowania. W programowaniu strukturalnym stosuje się moduły, które to komunikują się ze sobą odpowiednio zaplanowanymi interfejsami. Kod programu dzielony jest na funkcje wywołane z jej parametrami, dzięki czemu nie korzystają ze zmiennych globalnych. Jako struktury algorymiczne stosuje się: sekwencję operacji, funkcję warunkową, pętle (iterację) oraz rekurencję.
Programowanie obiektowe Podstawą programowania obiektowego jest wprowadzenie pojęcia obiektu. Wewnątrz, którego wyróżniamy jego atrybuty oraz metody. Najważniejsza cechy programowania obiektowego: abstrakcja, hermetyzacja, dziedziczenie, polimorfizm.
Programowanie obiektowe Abstrakcja – każdy obiekt to pewien model, który wykonuje pewne prace, opisuje i zmienia swój stan oraz komunikuje się z innymi obiektami. przykład z człowiekiem jako mężczyzną i kobietą. Hermetyzacja - enkapsulacja (ukrywanie implementacji) – zapewnia, że obiekt nie może zmienić stanu atrybutów innych obiektów w nieoczekiwany sposób, a jedynie metody są uprawnione do zmiany jego stanu.
Programowanie obiektowe Dziedziczenie - nazywamy mechanizm współdzielenia metod między klasami, klasa może dziedziczyć po innej klasie, oznacza to, że oprócz swoich własnych atrybutów oraz metod, uzyskuje także te pochodzące z klasy, z której dziedziczy. Polimorfizm - to cecha dzięki której jeden interfejs może być stosowany do wykonania różnych zadań. przykład z metodą daj_głos dla klasy pies i kot
Różnice Programowanie strukturalne wykorzystuje funkcje, te funkcje pracują na pewnych zmiennych i oddają wynik. Jednak nie komunikują się między sobą. Programowanie obiektowe grupuje zmienne i metody w jedną całość, czyli obiekt. Wywołanie metody powoduje zmianę stanu obiektu, jego atrybutów. W podejściu obiektowym zmienne powiązane są logicznie ze sobą tak jak w rzeczywistości. Zmiana jednego atrybutu może zmienić wartość innego.
T: Obiektowość jako podstawa naturalnego postrzegania świata Programowanie C++ T: Obiektowość jako podstawa naturalnego postrzegania świata
Co nazywamy obiektem w świecie rzeczywistym? Wszystko może być obiektem. drzewa, kwiaty, rzeki, domy, miasta, ludzie, samochód …
Projekt i twór Zanim stworzymy jakiś obiekt, trzeba ustalić czym ten obiekt będzie. W zależności od tego, czy chcemy stworzyć wirtualny samochód, czy motor, należy określić dwie rzeczy: jakie atrybuty będzie miał ten obiekt, jakie będzie miał metody działania.
T: Definicje klas i obiektów. Programowanie C++ T: Definicje klas i obiektów.
Klasa Klasa to byt programistyczny określający jakie atrybuty i metody będą miały obiekty, które zostaną utworzone na jej podstawie.
Obiekt Aby „ożywić” klasę, należy utworzyć jej tak zwaną instancję – czyli po prostu utworzyć jej obiekt.
T: Przykłady odwzorowania rzeczywistości w kategoriach obiektów Programowanie C++ T: Przykłady odwzorowania rzeczywistości w kategoriach obiektów
Ćwiczenia praktyczne
T: Opracowanie obiektowego opisu przykładowego programu Programowanie C++ T: Opracowanie obiektowego opisu przykładowego programu
Ćwiczenia praktyczne
T: Definiowanie klas, składniki klasy Programowanie C++ T: Definiowanie klas, składniki klasy
Definicja klasy class NaszaNazwaKlasy { … // pola i metody składowe klasy };
Przykład klasy class NazwaKlasy { public: //specyfikator dostępu //definiowanie pól int poleInt; float poleFloat; //deklarowanie metod int Metoda1(); void Metoda2(); };
Przykład definicji metody class bryla { public: float a,b,h; float ObliczObjetosc(); }; //definicja metody poza definicją klasy float bryla::ObliczObjetosc() return a*b*h; }
Przykład definicji metody class bryla { public: float a,b,h; //definicja metody wewnątrz klasy float ObliczObjetosc() { return a*b*h; };
T: Definiowanie obiektów, odwoływanie się do składowych obiektu Programowanie C++ T: Definiowanie obiektów, odwoływanie się do składowych obiektu
Deklaracja obiektu NazwaKlasy Obiekt; // deklaracja wskaźnika do obiektu NazwaKlasy *ObiektWsk = new NazwaKlasy;
Dostęp do pól i metod //przypisanie wartości Obiekt.poleInt = 0; Obiekt.poleFloat = 9.04; //wywołanie metody obiektu Obiekt.Metoda1();
Dostęp do pól i metod //przypisanie wartości ObiektWsk->poleInt = 0; ObiektWsk->poleFloat = 9.04; //wywołanie metody obiektu ObiektWsk->Metoda1();
Niszczenie obiektu delete ObiektWsk;
Przykład bryła.cpp
T: Hermetyzacja danych Programowanie C++ T: Hermetyzacja danych
Enkapsulacja Polega na ukrywaniu metod i atrybutów dla klas zewnętrznych. Dostęp do metod i atrybutów możliwy jest tylko z wewnątrz klasy, do której one należą lub z klas zaprzyjaźnionych i klas dziedziczących.
Kontrola dostępu Poziom dostępności do metod i atrybutów można regulować za pomocą modyfikatorów. Modyfikatory: public - pozwala na wolny, nieograniczony dostęp do atrybutów z dowolnej, innej klasy, private - dostęp do atrybutów tylko i wyłącznie dla klasy, której są elementami, protected - atrybuty będą dostępne jedynie dla bieżącej klasy oraz dla wszystkich klas po niej dziedziczących.
Przykład bank.cpp
T: Konstruktory i dekonstruktory Programowanie C++ T: Konstruktory i dekonstruktory
Konstruktor Jest specyficzną funkcją, która jest wywoływana zawsze gdy tworzony jest obiekt. Jeśli programista nie utworzy go, kompilator automatycznie utworzy konstruktor, który nic nie robi. Możemy stworzyć własny konstruktor, który będzie posiadła stworzone przez nas własności np. będzie inicjował wartości atrybutów obiektu.
nazwa konstruktora identyczna Przykład class przykładowa { public: // deklaracja atrybutów przykładowa (typ argument) { // // ciało konstruktora }; nazwa konstruktora identyczna jak nazwa klasy
Przykład class samochod { public: string marka, model; samochod () { marka=”brak”; model=”brak”; }; samochod (string m1, string m2) { marka=m1; model=m2;
Lista inicjalizacyjna Oczekuje się by obiekt po utworzeniu był w pełni gotowy do użycia. Aby to spełnić konstruktor powinien dokonywać pełnej inicjalizacji wszystkich atrybutów/danych w obiektach. Sposób inicjalizacji może zależeć od sposobu konstrukcji samego obiektu. Informacji potrzebnych do inicjalizacji składowych obiektu nie można podawać w miejscu ich definicji, lecz muszą one stanowić nierozłączną część konstruktora.
Przykład class samochod { public: string marka, model; samochod (string m1, string m2) : marka(m1), model(m2) { // po dwukropku znajduje się lista inicjalizacyjna };
Destruktor Podczas życia obiektu rezerwujemy pamięć, którą chcielibyśmy zwolnić zawsze po usunięciu obiektu. Pierwszym wariantem jest pamiętanie o wywołaniu funkcji, która będzie za to odpowiedzialna. Takie podejście jest niezalecane i ryzykowne, ponieważ bardzo łatwo zapomnieć o wywoływaniu tej funkcji. Zalecanym rozwiązaniem jest wykorzystanie destruktorów. Destruktor jest specjalną funkcją, która jest wywoływana zawsze tuż przed zniszczeniem (usunięciem) obiektu z pamięci.
Przykład class samochod { public: string marka, model; samochod () {}; // inne atrubuty i metody ~samochód () { // ciało destruktora };
T: Zagnieżdżona definicja klasy Programowanie C++ T: Zagnieżdżona definicja klasy
Zagnieżdżona definicja klasy W C++ można umieścić deklarację klasy w innej klasie. Klasą zagnieżdżoną to klasa zadeklarowana w jej wnętrzu. Funkcje składowe klasy zewnętrznej mogą tworzyć obiekty klasy zagnieżdżonej i używać ich. Na zewnątrz klasa wewnętrzna jest widoczna jeśli umieszczona została w sekcji public.
Przykład class samochod { public: string marka, model, rocznik; class mechanik // klasa zagnieżdżona string imię; mechanik () {…}; };
T: Przeładowanie operatorów i nazw funkcji Programowanie C++ T: Przeładowanie operatorów i nazw funkcji
Przeładowanie/przeciążenie metod Język C++ umożliwia tworzenie wielu metod o tej samej nazwie w ramach jednej klasy. Aby program wiedział, której metody użyć w danym momencie, muszą one się różnić typem lub liczbą argumentów. przeciążanie (ang. overloading).
Przeładowanie/przeciążenie operatorów Przeładowywanie operatorów, jest to definiowanie operatorów dla własnych typów. Można tego dokonać w większości przypadków jako metodę.
przeładować można następujące operatory: + - * / % // operator modulo ^ & ~ ! = // gdy go nie zdefi- niujemy robi to za nas kompilator < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- , // gdy go nie zdefiniuje- my robi to za nas kompilator ->* -> () // operator wywołania funkcji [] new // ponizsze operatory gdy ich nie zdefiniujem y robi to za nas kompilator new[] delete delete[]
Przykład wektor.cpp
T: Zaprzyjaźnione funkcje klasy Programowanie C++ T: Zaprzyjaźnione funkcje klasy
Funkcje zaprzyjaźnione Funkcja zaprzyjaźniona z klasą to funkcja, która mimo, że nie należy do klasy posiada pełny dostęp do wszystkich składników tej klasy.
Przykład wektor2.cpp