Wprowadzenie do programowania obiektowego w C++



Podobne dokumenty
Zofia Kruczkiewicz, ETE8305_2 1

Dziedziczenie jednobazowe, poliformizm

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Szablony klas, zastosowanie szablonów w programach

Programowanie 2. Język C++. Wykład 3.

Nowe słowa kluczowe. Komentarze. Wskaźniki typu void. class, delete, new, friend,... /* Komentarz w C i C++ */ // Komentarz w C++ (do końca wiersza)

Zaawansowane programowanie w języku C++ Klasy w C++

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

PARADYGMATY PROGRAMOWANIA Wykład 2

PARADYGMATY PROGRAMOWANIA Wykład 4

TEMAT : KLASY DZIEDZICZENIE

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Dziedziczenie. Ogólna postać dziedziczenia klas:

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Abstrakcyjny typ danych

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Dziedziczenie jednobazowe, poliformizm, tablice wskaźników na obiekty

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Programowanie w Internecie. Java

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wykład 8: klasy cz. 4

Język C++ Programowanie obiektowe

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Programowanie obiektowe

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Podstawy Programowania Obiektowego

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Wykład 4: Klasy i Metody

PODEJŚCIE OBIEKTOWE. Przykład 1 metody i atrybuty statyczne

Język C++ Różnice między C a C++

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

> C++ dziedziczenie. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody

Materiały do zajęć VII

Wskaznik. Przekazywanie wyniku funkcji przez return. Typy i zmienne wskaznikowe. Zmienna wskazywana. typ * nazwa_wkaznika

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Zaawansowane programowanie w C++ (PCP)

Wykład 5 Okna MDI i SDI, dziedziczenie

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Programowanie obiektowe

Programowanie obiektowe w C++ Wykład 12

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

TEMAT : KLASY POLIMORFIZM

Szablony funkcji i szablony klas

Podstawy Programowania Obiektowego

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Wykład 5: Klasy cz. 3

Dziedziczenie & W slajdach są materiały zapożyczone z

Kurs WWW. Paweł Rajba.

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie obiektowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Projektowanie klas c.d. Projektowanie klas przykład

Programowanie obiektowe

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Programowanie Obiektowe i C++

Zaawansowane programowanie w C++ (PCP)

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Rozdział 4 KLASY, OBIEKTY, METODY

Do czego służą klasy?

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

Typy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura

DYNAMICZNE PRZYDZIELANIE PAMIECI

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

ALGORYTMY I STRUKTURY DANYCH

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Języki i paradygmaty programowania

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Definiowanie własnych klas

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Konstruktor kopiujacy

Mechanizm dziedziczenia

Zaawansowane programowanie w języku C++ Programowanie obiektowe

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Programowanie 2. Język C++. Wykład 9.

Programowanie obiektowe w języku C++ Zarządzanie procesami. dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów

FUNKCJE WZORCOWE. Wykład 10. Programowanie Obiektowe (język C++) Funkcje wzorcowe wprowadzenie (2) Funkcje wzorcowe wprowadzenie (1)

Programowanie obiektowe w języku

PARADYGMATY PROGRAMOWANIA Wykład 3

Co nie powinno być umieszczane w plikach nagłówkowych:

Wstęp do Programowania 2

Transkrypt:

Wprowadzenie do programowania obiektowego w C++ 1. Główne zasady programowania obiektowego: hermetyzacja, dziedziczenie, polimorfizm 2. Pojęcie klasy: sposoby deklarowania i definiowania składowych klasy 3. Atrybuty dostępu do składowych - private, protected i public wspierające hermetyzację 4. Obiekty automatyczne, statyczne i dynamiczne 5. Konstruktory i destruktory 6. Składowe klasy typu static 7. Zmienne referencyjne, przekazywanie parametrów przez referencję, autoreferencja 8. Pliki nagłówkowe, dyrektywy preprocesora, programy wielo-plikowe Zofia Kruczkiewicz, ETE8305_2 1

Wprowadzenie do programowania obiektowego w C++ 1. Główne zasady programowania obiektowego: hermetyzacja, dziedziczenie, polimorfizm Zofia Kruczkiewicz, ETE8305_2 2

1.1. Hermetyzacja (enkapsulacja) - ochrona przed bezpośrednim dostępem do danych zawartych w klasie/obiekcie Część publiczna klasy/obiektu - metody Część prywatna i chroniona klasy/obiektu - dane i metody Realizacja: Do danych umieszczonych w klasie należy się odwołać jedynie za pośrednictwem metod tej klasy/obiektu Dostęp do składowych klasy można ograniczać specyfikatorami dostępu: private, protected, public Zofia Kruczkiewicz, ETE8305_2 3

1.2. Dziedziczenie Budowa nowych klas (nadklas) na podstawie własności klas istniejących (podklas) Przykłady: Drzewo pojazdów: A2-pojazd, B2-samochód, C2-samochod osobowy, D2-łódź, E2-motorówka, F2-amfibia Drzewo hierarchii stanowisk: A3-pracownik, C3-projektant, D3-kierownik, B3-czasowy, F3-konsultatnt, E3-czasowy projektant, G3-dyrektor dziedziczenie A3 A2 B3 C3 D3 B2 D2 E3 G3 C2 F2 E2 F3 Zofia Kruczkiewicz, ETE8305_2 4

1.3. Polimorfizm Uogólnianie pewnych cech na poziomie korzenia drzewa dziedziczenia w celu uproszczenia obsługi klas/obiektów z całej rodziny Klasa abstrakcyjna dla klasy Rysunek Figura położenie virtual Rysuj() 1..n 1..p Agregacja Polimorfizm - metoda wirtualna Rysuj() w klasach pochodnych metody Rysuj() przesłaniają tę metodę. 1 Rysunek Narysuj() Dziedziczenie + polimorfizm Grupa_figur Wielokąt Linia Kolo 1 Rysuj() Rysuj() 1 1..m Rysuj() Rysuj() Zofia Kruczkiewicz, ETE8305_2 5

Wprowadzenie do programowania obiektowego w C++ 1. Główne zasady programowania obiektowego: hermetyzacja, dziedziczenie, polimorfizm 2. Pojęcie klasy: sposoby deklarowania i definiowania składowych klasy, Zofia Kruczkiewicz, ETE8305_2 6

Klasa jest typem danych definiowanym przez użytkownika Klasa stanowi połączenie: 1) innych typów danych (predefiniowanych lub definiowanych przez użytkownika) 2) funkcji przeznaczonych do przetwarzania tych danych (metody) Składnia klasy: class" "struct" "union nazwa klasy [:lista klas bazowych] { lista składowych klasy }; lista klas bazowych * - opcjonalna lista klas, od których dziedziczy dana klasa lista składowych klasy - deklaruje składowe klasy, czyli dane i metody Zofia Kruczkiewicz, ETE8305_2 7

Przykład klasy a) Dostęp do składowych private (domyślny), protected i public. b) Deklaracja składowych wewnątrz klasy. C) Definicja składowych na zewnątrz klasy kod metod występuje w jednym miejscu i jest wspólny dla wszystkich obiektów, które są instancją tej klasy //--------------------------------------------------------------------------- #include <iostream.h> //--------------------------------------------------------------------------- class TProdukt1 { //protected: string nazwa; float cena; public: float Podaj_cene(); void Nadaj_cene(float ); string Podaj_nazwe (); void Nadaj_nazwe(string ); int Porownaj_produkty(TProdukt1& ); void Wyswietl(); }; składowe są tylko deklarowane wewnątrz ciała klasy Zofia Kruczkiewicz, ETE8305_2 8

float TProdukt1::Podaj_cene() { return cena; } void TProdukt1::Nadaj_cene(float cena_) { cena = cena_; } string TProdukt1::Podaj_nazwe () { return nazwa; } void TProdukt1::Nadaj_nazwe(string nazwa_) { nazwa = nazwa_;} definicja metod poza ciałem klasy int TProdukt1::Porownaj_produkty(TProdukt1& p) { return Podaj_nazwe() == p.podaj_nazwe() && Podaj_cene() == p.podaj_cene(); } void TProdukt1::Wyswietl() { cout<<"cena produktu: "<<cena<< ", Nazwa produktu: "<<nazwa<<endl; } Zofia Kruczkiewicz, ETE8305_2 9

Wprowadzenie do programowania obiektowego w C++ 1. Główne zasady programowania obiektowego: hermetyzacja, dziedziczenie, polimorfizm 2. Pojęcie klasy: sposoby deklarowania i definiowania składowych klasy, 3. Atrybuty dostępu do składowych - private, protected i public wspierające hermetyzację Zofia Kruczkiewicz, ETE8305_2 10

3.1. Deklaracje dostępu do poszczególnych sekcji klasy lista składowych klasy: [specyfikator dostępu :] lista składowych klasy private: sekcja prywatna (domyślna dla class) - składowe klasy są widoczne tylko w obrębie składowych danej klasy oraz w funkcjach/ klasach zaprzyjaźnionych protected: sekcja zabezpieczona - składowe są widoczne jedynie tylko w obrębie innych składowych klasy, składowych klas dziedziczących oraz w funkcjach/ klasach zaprzyjaźnionych public: sekcja publiczna (domyślna dla struct i union)- składowe są widoczne w całym programie Zofia Kruczkiewicz, ETE8305_2 11

3.2. Deklaracje dostępu do klas podstawowych* :lista klas bazowych specyfikator dostępu lista klas bazowych private: public: publiczne i chronione składowe klasy podstawowej są prywatnymi składowymi klasy pochodnej, natomiast prywatne stają się niedostępne (wyjątek: klasa pochodna jest zadeklarowana jako friend w klasie podstawowej) publiczne oraz chronione składowe klasy podstawowej są publicznymi oraz chronionymi składowymi klasy pochodnej. Zofia Kruczkiewicz, ETE8305_2 12

Program 1 - Dostęp do składowych private (domyślny), protected i public //--------------------------------------------------------------------------- #include <iostream.h> //--------------------------------------------------------------------------- class TProdukt1 { //protected: string nazwa; float cena; public: float Podaj_cene(); void Nadaj_cene(float ); string Podaj_nazwe (); void Nadaj_nazwe(string ); int Porownaj_produkty(TProdukt1& ); void Wyswietl(); }; Zofia Kruczkiewicz, ETE8305_2 13

float TProdukt1::Podaj_cene() { return cena; } void TProdukt1::Nadaj_cene(float cena_) { cena = cena_; } string TProdukt1::Podaj_nazwe () { return nazwa; } void TProdukt1::Nadaj_nazwe(string nazwa_) { nazwa = nazwa_;} int TProdukt1::Porownaj_produkty(TProdukt1& p) { return Podaj_nazwe() == p.podaj_nazwe() && Podaj_cene() == p.podaj_cene(); } void TProdukt1::Wyswietl() { cout<<"cena produktu: "<<cena<<", Nazwa produktu: "<<nazwa<<endl; } Zofia Kruczkiewicz, ETE8305_2 14

int main(int argc, char* argv[]) { TProdukt1 produkt1, produkt2; Można wywoływać składowe produkt1.nadaj_cene(3.5); typu public w programie. produkt1.nadaj_nazwe("zeszyt"); Nie można skompilować produkt2.nadaj_cene(1.6); // 3.5 programu, gdy atrybut nazwa produkt2.nadaj_nazwe("atrament"); // Zeszyt jest typu private lub produkt1.wyswietl(); protected produkt2.wyswietl(); //cout<< produkt1.nazwa<<endl; if (produkt1.porownaj_produkty(produkt2)) cout<<"produkty maja rowne atrybuty"<<endl; else cout<<"produkty nie maja rownych atrybutow"<<endl; cin.get(); return 0; } Zofia Kruczkiewicz, ETE8305_2 15

Wprowadzenie do programowania obiektowego w C++ 1. Główne zasady programowania obiektowego: hermetyzacja, dziedziczenie, polimorfizm 2. Pojęcie klasy: sposoby deklarowania i definiowania składowych klasy, 3. Atrybuty dostępu do składowych - private, protected i public wspierające hermetyzację 4. Konstruktory i destruktory Zofia Kruczkiewicz, ETE8305_2 16

Konstruktory - metody o nazwie klasy, wywoływane zawsze podczas tworzenia obiektu Są to metody domyślne lub jawne zadeklarowane o różnej liście parametrów. Domyślny zwykły konstruktor bezparametrowy: nazwa_klasy(); Domyślny konstruktor kopiujący: nazwa_klasy(nazwa_klasy&); Jawne zwykłe konstruktory z parametrami i jeden bez parametrów albo istnieje jeden domyślny, albo dowolna liczba jawnych konstruktorów Jawny konstruktor kopiujący jest tylko jeden i posiada identyczny nagłówek jak konstruktor kopiujący domyślny albo istnieje domyślny albo jawny Konstruktor kopiujący jawny lub domyślny jest wywołany podczas: przekazywania obiektów przez wartość do funkcji/metody zwracania obiektu przez wartość jako wyniku funkcji/metody inicjowania definiowanego obiektu obiektem tej samej klasy. Pozostałe konstruktory (domyślny lub jawne) są wywoływane podczas: definiowania zmiennych obiektowych alokacji pamięci dla obiektów Zofia Kruczkiewicz, dynamicznych ETE8305_2 za pomocą operatora new. 17

Destruktor - tylko jedna metoda bezparametrowa ~nazwa_klasy() Może być zdefiniowany jawnie lub jest domyślny. Domyślny destruktor istnieje zawsze, gdy nie zdefiniowanego jawnego destruktora. Jawna definicja destruktora likwiduje destruktor domyślny. Jawna definicja destruktora jest wymagana do zwolnienia pamięci przeznaczonej na dynamiczne składowe klasy lub wykonania pewnych czynności związanych z usuwanym obiektem. Jest ona wywoływana zawsze podczas usuwania obiektu z pamięci (podczas wywołania operatora delete przy usuwaniu obiektu dynamicznego, dla pozostałych obiektów po wyjściu z bloku ich definicji Zofia Kruczkiewicz, ETE8305_2 18

Program 2 konstruktory i destruktor domyślne (dotyczy to także programu 1) //--------------------------------------------------------------------------- #include <iostream.h> //--------------------------------------------------------------------------- class TProdukt1 { // protected: string nazwa; float cena; public: float Podaj_cene() { return cena; } void Nadaj_cene(float cena_) { cena = cena_;} string Podaj_nazwe () { return nazwa; } void Nadaj_nazwe(string nazwa_) { nazwa = nazwa_;} int Porownaj_produkty(TProdukt1& p) }; Deklaracja i definicja składowych wewnątrz klasy. Są to domyślnie składowe typu inline, których kod wkleja się do kodu programu w miejscu ich wywołania duży program może szybciej działać, ponieważ nie traci czasu na wywołanie metody, ale może mieć większe rozmiary { return Podaj_nazwe()==p.Podaj_nazwe() && Podaj_cene()==p.Podaj_cene(); } void Wyswietl() { cout<<"cena produktu: "<<cena<<", Nazwa produktu: "<<nazwa<<endl; } 19

int main(int argc, char* argv[]) { TProdukt1 produkt1, produkt2; produkt1.nadaj_cene(3.5); produkt1.nadaj_nazwe("zeszyt"); produkt2.nadaj_cene(1.6); // 3.5 produkt2.nadaj_nazwe("atrament"); // Zeszyt produkt1.wyswietl(); produkt2.wyswietl(); //cout<< produkt1.nazwa<<endl; if (produkt1.porownaj_produkty(produkt2)) cout<<"produkty maja rowne atrybuty"<<endl; else cin.get(); return 0; } cout<<"produkty nie maja rownych atrybutow"<<endl; Można wywoływać składowe typu public w programie. Nie można skompilować programu, gdy atrybut nazwa jest typu private lub protected Zofia Kruczkiewicz, ETE8305_2 20

Program 3 konstruktory i destruktor jawne -zastosowanie konstruktora kopiującego przy przekazywaniu obiektu przez wartość oraz tworzenia nowego obiektu przez przypisanie do niego istniejącego obiektu (tworzenie kopii obiektu) //--------------------------------------------------------------------------- #include <iostream.h> //--------------------------------------------------------------------------- class TProdukt1 { //protected: string nazwa; float cena; public: TProdukt1(string, float ); TProdukt1(TProdukt1&); ~TProdukt1(); float Podaj_cene(); void Nadaj_cene(float ); string Podaj_nazwe (); void Nadaj_nazwe(string ); int Porownaj_produkty(TProdukt1 ); void Wyswietl(); }; Konstruktor zwykły z parametrami Konstruktor kopiujący Destruktor Tutaj zostanie przekazana kopia obiektu typu TProdukt1 (przekazanie przez wartość) za pomocą wywołanego konstruktora kopiującego w tym programie jawnego, lecz może to zrobić również konstruktor domyślny Zofia Kruczkiewicz, ETE8305_2 21

TProdukt1::TProdukt1(string nazwa_, float cena_) { cout<<"wywolany zwykly konstruktor z parametrami"<<endl; nazwa = nazwa_; cena = cena_; } TProdukt1::TProdukt1(TProdukt1& p) { cout<<"wywolany konstruktor kopiujacy"<<endl; nazwa = p.nazwa; cena = p.cena; } TProdukt1::~TProdukt1() { cout << "Wywolany destrutor"<<endl; } float TProdukt1::Podaj_cene() { return cena; } void TProdukt1::Nadaj_cene(float cena_) Tutaj zostanie przekazana { cena = cena_; } kopia obiektu typu TProdukt1 string TProdukt1::Podaj_nazwe () (przekazanie przez wartość) { return nazwa; } za pomocą wywołanego void TProdukt1::Nadaj_nazwe(string nazwa_) konstruktora kopiującego { nazwa = nazwa_;} int TProdukt1::Porownaj_produkty(TProdukt1 p) { return Podaj_nazwe()==p.Podaj_nazwe() && Podaj_cene()==p.Podaj_cene(); } void TProdukt1::Wyswietl() { cout<<"cena produktu: "<<cena<<", Nazwa produktu: "<<nazwa<<endl; } Zofia Kruczkiewicz, ETE8305_2 22

int main(int argc, char* argv[]) { { TProdukt1 produkt1("zeszyt", 3.5), produkt2("atrament", 1.6); // 1, 2 } TProdukt1 produkt3 = produkt2; //3 produkt1.wyswietl(); produkt2.wyswietl(); produkt3.wyswietl(); if (produkt1.porownaj_produkty(produkt2)) // 4, 5 cout<<"produkty maja rowne atrybuty"<<endl; else cout<<"produkty nie maja rownych atrybutow"<<endl; } // 6, 7, 8 cout<<"tutaj juz nie ma obiektow"<<endl; //produkt1.wyswietl(); cin.get(); return 0; 1 2 3 Utworzono nowy obiekt produkt3 jako kopię obiektu produkt2 za pomocą konstruktora kopiującego 5 4 6 7 8 Zofia Kruczkiewicz, ETE8305_2 23

Wprowadzenie do programowania obiektowego w C++ 1. Główne zasady programowania obiektowego: hermetyzacja, dziedziczenie, polimorfizm 2. Pojęcie klasy: sposoby deklarowania i definiowania składowych klasy, 3. Atrybuty dostępu do składowych - private, protected i public wspierające hermetyzację 4. Konstruktory i destruktory 5. Obiekty automatyczne, statyczne i dynamiczne Zofia Kruczkiewicz, ETE8305_2 24

Rodzaje zmiennych typu obiektowego - obiektów: Automatyczne - są definiowane (tworzone) wewnątrz dowolnego bloku funkcji. Są usuwane, gdy wychodzi się z danego bloku lub z funkcji. Statyczne: definiowane poza funkcjami jako zmienne globalne (o zasięgu wieloplikowym deklarowane jako extern) jako globalne zmienne typu static o zasięgu jednoplikowym wewnątrz dowolnej funkcji, gdy definicja jest poprzedzona słowem static (dostępne są tylko wewnątrz działającej funkcji z zachowaniem wartości wyznaczonych podczas poprzedniego wywołania). Istnieją one przez cały czas działania programu i usuwane są po jego zakończeniu. Dynamiczne* - tworzone jawnie w czasie działania programu na stercie (heap) za pomocą operatora new i usuwane Zofia Kruczkiewicz, ETE8305_2 25 za pomocą operatora delete

Statyczne, globalne obiekty wejścia cin i wyjścia cout, operator wejścia >> oraz wyjścia << //--------------------------------------- #include <iostream.h> //--------------------------------------- int main(int argc, char* argv[]) { cout << "Prosty program\n"; } cin.get(); return 0; ostream cout; //---------------------------------------- #include <iostream.h> //---------------------------------------- int main(int argc, char* argv[]) { int liczba; cout << "Podaj liczbe całkowita: "; cin >> liczba; cin.get(); cout << "Podano liczbe: " << liczba << endl; cin.get(); return 0; } #include <iostream> extern ostream cout; #include <iostream> extern istream cin; istream cin; Zofia Kruczkiewicz, ETE8305_2 26

Obiekty automatyczne Zofia Kruczkiewicz, ETE8305_2 27

int main(int argc, char* argv[]) // funkcja main dla klasy TProdukt1 z programu 3 { //definiowanie automatycznych obiektow { TProdukt1 produkt1("zeszyt", 3.5), produkt2("atrament", 1.6); // 1, 2 produkt1.wyswietl(); produkt2.wyswietl(); if (produkt1.porownaj_produkty(produkt2)) // 3, 4 cout<<"produkty maja rowne atrybuty"<<endl; else cout<<"produkty nie maja rownych atrybutow"<<endl; } // 5, 6 cout<<"tutaj juz nie ma obiektow"<<endl; //produkt1.wyswietl(); cin.get(); return 0; } 1 2 3 4 5 6 W metodzie Porownaj_produkty pojawia się obiekt automatyczny Poza blokiem nie ma obiektów automatycznych Zofia Kruczkiewicz, ETE8305_2 28

Obiekty statyczne Zofia Kruczkiewicz, ETE8305_2 29

int main(int argc, char* argv[]) // klasa TProduk1 z programu 3 { //definiowanie statycznych obiektów { static TProdukt1 produkt1("zeszyt", 3.5), produkt2("atrament", 1.6); // 1, 2 } produkt1.wyswietl(); produkt2.wyswietl(); if (produkt1.porownaj_produkty(produkt2)) // 3, 4 cout<<"produkty maja rowne atrybuty"<<endl; else cout<<"produkty nie maja rownych atrybutow"<<endl; } cout<<"tutaj juz nie ma dostepu do obiektow statycznych"<<endl; //5 //produkt1.wyswietl(); cin.get(); return 0; 1 2 W metodzie Porownaj_produkty pojawia się obiekt automatyczny Poza blokiem są dalej obiekty statyczne (brak wywołanych destruktorów), jednak nie można wywołać ich metod poza blokiem definicji 3 5 4 Zofia Kruczkiewicz, ETE8305_2 30

Wprowadzenie do programowania obiektowego w C++ 1. Główne zasady programowania obiektowego: hermetyzacja, dziedziczenie, polimorfizm 2. Pojęcie klasy: sposoby deklarowania i definiowania składowych klasy, 3. Atrybuty dostępu do składowych - private, protected i public wspierające hermetyzację 4. Konstruktory i destruktory 5. Obiekty automatyczne, statyczne i dynamiczne 6. Składowe klasy typu static Zofia Kruczkiewicz, ETE8305_2 31

Składowe typu static W klasie dane i metody mogą być typu static. Tylko jedna kopia danych statycznych istnieje dla wszystkich obiektów tej klasy. Statyczna metoda klasy A klasy globalnej ma zewnętrzny zasięg. Metoda klasy lokalnej nie ma takiego zasięgu. Statyczna metoda jest związana jedynie z klasą, w której jest zadeklarowana. Taka funkcja nie może być wirtualną*. Statyczna metoda może wywoływać jedynie inne statyczne składowe typu metody lub dane. Taka funkcja nie może używać autoreferencji this. Statyczna składowa może być wywołana w metodzie niestatycznej Zofia Kruczkiewicz, ETE8305_2 32

Program 4 Zastosowanie składowych typu static //--------------------------------------------------------------------------- #include <iostream.h> //--------------------------------------------------------------------------- class TProdukt1 { protected: static int ile_obiektow; string nazwa; float cena; public: TProdukt1(string, float ); TProdukt1(TProdukt1&); ~TProdukt1(); float Podaj_cene(); void Nadaj_cene(float ); string Podaj_nazwe (); void Nadaj_nazwe(string ); int Porownaj_produkty(TProdukt1 ); void Wyswietl(); static int liczba_obiektow(); }; Zofia Kruczkiewicz, ETE8305_2 33

} int TProdukt1::ile_obiektow = 0; int TProdukt1::liczba_obiektow() { return ile_obiektow; } TProdukt1::TProdukt1(string nazwa_, float cena_) { cout<<"wywolany zwykly konstruktor z parametrami"<<endl; nazwa = nazwa_; cena = cena_; ile_obiektow++; cout<<"liczba obiektow : "<<ile_obiektow<<endl; } TProdukt1::TProdukt1(TProdukt1& p) { cout<<"wywolany konstruktor kopiujacy"<<endl; nazwa = p.nazwa; cena = p.cena; ile_obiektow++; cout<<"liczba obiektow : "<<liczba_obiektow()<<endl; } TProdukt1::~TProdukt1() { cout << "Wywolany destrutor"<<endl; ile_obiektow--; cout<<"liczba obiektow : "<<liczba_obiektow()<<endl; } //... Definicja składowych typu static Zofia Kruczkiewicz, ETE8305_2 34

int main(int argc, char* argv[]) { cout <<"Liczba obiektow: "<< TProdukt1::liczba_obiektow()<<endl; // 1 { TProdukt1 produkt1("zeszyt", 3.5), produkt2("atrament", 1.6); //2, 3 cout <<"Liczba obiektow: "<< produkt1.liczba_obiektow()<<endl; // 4 produkt1.wyswietl(); produkt2.wyswietl(); if (produkt1.porownaj_produkty(produkt2)) // 5, 6 cout<<"produkty maja rowne atrybuty"<<endl; else cout<<"produkty nie maja rownych atrybutow"<<endl; } // 7, 8 cin.get(); return 0; } 1 2 3 4 5 6 7 8 Zofia Kruczkiewicz, ETE8305_2 35

Wprowadzenie do programowania obiektowego w C++ 1. Główne zasady programowania obiektowego: hermetyzacja, dziedziczenie, polimorfizm 2. Pojęcie klasy: sposoby deklarowania i definiowania składowych klasy, 3. Atrybuty dostępu do składowych - private, protected i public wspierające hermetyzację 4. Konstruktory i destruktory 5. Obiekty automatyczne, statyczne i dynamiczne 6. Składowe klasy typu static 7. Zmienne referencyjne, przekazywanie parametrów przez referencję, autoreferencja Zofia Kruczkiewicz, ETE8305_2 36

Autoreferencja, zmienne referencyjne, przekazywanie parametrów przez referencję 1) Autoreferencja this jest wskaźnikiem do obiektu, istniejącym w momencie wywoływania danej metody. Autoreferencję this można użyć, aby wskazać składową klasy, gdy istnieje konflikt nazw 2) Zmienna referencyjna jest to zmienna tożsama z inną zmienną int zmienna_1; int& ref_zmienna_1 = zmienna_1; Zmienna zmienna_1 jest dostępna pod dwiema nazwami: zmienna_1 oraz ref_zmienna_1. Typ zmiennej referencyjnej musi być identyczny z typem zmiennej, z którą jest powiązana. 3) Referencja typu stała const int& ref_stała = 1; Zmienna ref_stała ma dostęp do wartości 1 umieszczonej w zmiennej tymczasowej. Nie można zmienić jej wartości. Zofia Kruczkiewicz, ETE8305_2 37

3) Przekazywanie parametrów w funkcji/metodzie przez wartość i referencję. //------------------------------------------------------------- #include <iostream.h> //------------------------------------------------------------- void f (int wart, int& ref, const float& st) { wart++; ref++; cout << "k: "<<st <<'\n'; } int main(int argc, char* argv[]) { int i = 1; int j = 1; // long j =1; float k = 3; cout<<"i: "<<i<<", j: "<<j<<", k: "<<k<<endl; f(i, j, k); cout<<"i: "<<i<<", j: "<<j<<", k: "<<k<<endl; cin.get(); return 0; } Zofia Kruczkiewicz, ETE8305_2 38

Program 5 Przekazywanie obiektów przez referencję, autoreferencja this //--------------------------------------------------------------------------- #include <iostream.h> //--------------------------------------------------------------------------- class TProdukt1 { //protected: string nazwa; float cena; public: TProdukt1(string, float ); }; TProdukt1(TProdukt1&); ~TProdukt1(); float Podaj_cene(); void Nadaj_cene(float ); string Podaj_nazwe (); void Nadaj_nazwe(string ); int Porownaj_produkty(TProdukt1& ); void Wyswietl(); Tutaj zostanie przekazana referencja (adres) do obiektu typu TProdukt1). Do tego celu nie wywołuje się konstruktora kopiującego Zofia Kruczkiewicz, ETE8305_2 39

TProdukt1::TProdukt1(string nazwa_, float cena_) { cout<<"wywolany zwykly konstruktor z parametrami"<<endl; nazwa = nazwa_; cena = cena_; } TProdukt1::TProdukt1(TProdukt1& p) { cout<<"wywolany konstruktor kopiujacy"<<endl; nazwa = p.nazwa; cena = p.cena; } TProdukt1::~TProdukt1() { cout << "Wywolany destrutor"<<endl; } float TProdukt1::Podaj_cene() { return cena; } void TProdukt1::Nadaj_cene(float cena) { this->cena = cena; } // lub (*this).cena string TProdukt1::Podaj_nazwe () { return nazwa; } void TProdukt1::Nadaj_nazwe(string nazwa_) { nazwa = nazwa_; } int TProdukt1::Porownaj_produkty(TProdukt1& p) { return Podaj_nazwe()==p.Podaj_nazwe() && Podaj_cene()==p.Podaj_cene(); } void TProdukt1::Wyswietl() { cout<<"cena produktu: "<<cena<<", Nazwa produktu: "<<nazwa<<endl; } Autoreferencja this jest wskaźnikiem zawierającym adres obiektu danej klasy, istniejącym w momencie wywołania metody niestatycznej. this można użyć, aby wskazać składową klasy, gdy istnieje konflikt nazw Obiekt p jest przekazany przez referencję, dlatego nie jest wywołany konstruktor kopiujący Zofia Kruczkiewicz, ETE8305_2 40

int main(int argc, char* argv[]) { { TProdukt1 produkt1("zeszyt", 3.5), produkt2("atrament", 1.6); //1, 2 produkt1.wyswietl(); produkt2.wyswietl(); if (produkt1.porownaj_produkty(produkt2)) cout<<"produkty maja rowne atrybuty"<<endl; else cout<<"produkty nie maja rownych atrybutow"<<endl; } //3, 4 cout<<"tutaj juz nie ma obiektow"<<endl; //produkt1.wyswietl(); cin.get(); return 0; } 1 2 3 4 Zofia Kruczkiewicz, ETE8305_2 41

Wprowadzenie do programowania obiektowego w C++ 1. Główne zasady programowania obiektowego: hermetyzacja, dziedziczenie, polimorfizm 2. Pojęcie klasy: sposoby deklarowania i definiowania składowych klasy, 3. Atrybuty dostępu do składowych - private, protected i public wspierające hermetyzację 4. Konstruktory i destruktory 5. Obiekty automatyczne, statyczne i dynamiczne 6. Składowe klasy typu static 7. Zmienne referencyjne, przekazywanie parametrów przez referencję, autoreferencja 8. Pliki nagłówkowe, dyrektywy preprocesora, programy wieloplikowe Zofia Kruczkiewicz, ETE8305_2 42

#include <iostrem.h> - dołączenie pliku nagłówkowego z katalogu standardowego #include TProdukt1.h - dołączanie pliku nagłówkowego z katalogu bieżącego Pliki nagłówkowe powinny zawierać: definicje typów np. class punkt { float x, y; public: punkt (float, float); void przesun (float, float); }; szablony funkcji i klas template <class T> class stos { //...} prototypy funkcji np. void wyswietl_float(float); definicje funkcji typu inline inline int Większy(int x, int y) {return x > y; } deklaracje zmiennych extern int zmienna; definicje stałych const int max = 3; wyliczenia enum Boolean {False, True}; deklaracje nazw class kolo; dyrektywy #include <iostream.h> funkcje makra #define MAX(x, y) ((x) > (y)? (x) : (y)) Zofia Kruczkiewicz, ETE8305_2 stałe jawne #define TRUE 1 43

Uwaga: Nie należy nigdy wstawiać do pliku nagłówkowego: definicji zwykłych funkcji: int Większy(int x, int y) {return x > y; } definicji zmiennych: int zmienna; definicji stałych agregatów np. const char tab[] = aaa ; Zofia Kruczkiewicz, ETE8305_2 44

Przykład podziału programu na moduły funkcje interfejsu programu funkcje we_wy funkcja main, funkcje użytku jednorazowego definiowany typ w postaci klasy dodatki.h void f(); int z; strukt.h we_wy.h mkolejka.h dodatki.cpp we_wy.cpp kolejka.cpp main() mkolejka.cpp Kompilacja dodatki.obj we_wy.obj kolejka.obj mkolejka.obj Łączenie kolejka.exe tworzenie jednego pliku, definiowanie nazw z plików nagłówkowych Zofia Kruczkiewicz, ETE8305_2 45

Przykład podziału programu prezentowanego na wykładzie na moduły funkcje we_wy funkcja main, funkcje użytku jednorazowego definiowany typ w postaci klasy iostream.h Biblioteka Borland Builder C++ produkty.cpp main() TProdukt1.h TProdukt1.cpp Kompilacja produkty.obj TProdukt1.obj Łączenie produkty.exe tworzenie jednego pliku, definiowanie nazw z plików nagłówkowych Zofia Kruczkiewicz, ETE8305_2 46

Program 6 program wieloplikowy //plik nagłówkowy TProdukt1.h nie należy go wstawiać do projektu //--------------------------------------------------------------------------- #include <iostream.h> //--------------------------------------------------------------------------- #ifndef TPRODUKT1 //warunkowe dołączanie zawartości pliku #define TPRODUKT1 class TProdukt1 { //protected: string nazwa; float cena; public: TProdukt1(string, float ); TProdukt1(TProdukt1&); ~TProdukt1(); float Podaj_cene(); void Nadaj_cene(float ); string Podaj_nazwe (); void Nadaj_nazwe(string ); int Porownaj_produkty(TProdukt1 ); void Wyswietl(); }; #endif // nagłówkowego Zofia Kruczkiewicz, ETE8305_2 47

#include "TProdukt1.h" // zawartość pliku modułowego TProdukt1.cpp TProdukt1::TProdukt1(string nazwa_, float cena_) { cout<<"wywolany zwykly konstruktor z parametrami"<<endl; nazwa = nazwa_; cena = cena_; } TProdukt1::TProdukt1(TProdukt1& p) { cout<<"wywolany konstruktor kopiujacy"<<endl; nazwa = p.nazwa; cena = p.cena; } TProdukt1::~TProdukt1() { cout << "Wywolany destrutor"<<endl; } float TProdukt1::Podaj_cene() { return cena; } void TProdukt1::Nadaj_cene(float cena_) { cena = cena_; } string TProdukt1::Podaj_nazwe () { return nazwa; } void TProdukt1::Nadaj_nazwe(string nazwa_) { nazwa = nazwa_;} int TProdukt1::Porownaj_produkty(TProdukt1 p) { return Podaj_nazwe()==p.Podaj_nazwe() && Podaj_cene()==p.Podaj_cene(); } void TProdukt1::Wyswietl() Zofia Kruczkiewicz, ETE8305_2 48 { cout<<"cena produktu: "<<cena<<", Nazwa produktu: "<<nazwa<<endl; }

//--------------------------------------------------------------------------- #include "TProdukt1.h" //zawartość pliku z funkcją main //--------------------------------------------------------------------------- int main(int argc, char* argv[]) { { TProdukt1 produkt1("zeszyt", 3.5), produkt2("atrament", 1.6); produkt1.wyswietl(); produkt2.wyswietl(); if (produkt1.porownaj_produkty(produkt2)) cout<<"produkty maja rowne atrybuty"<<endl; else cout<<"produkty nie maja rownych atrybutow"<<endl; } cout<<"tutaj juz nie ma obiektow"<<endl; //produkt1.wyswietl(); cin.get(); return 0; } Zofia Kruczkiewicz, ETE8305_2 49