C++ Przeładowanie operatorów i wzorce w klasach

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

Podstawy Programowania Obiektowego

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

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

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

PARADYGMATY PROGRAMOWANIA Wykład 3

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

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

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

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

Szablony. Szablony funkcji

Szablony klas, zastosowanie szablonów w programach

PARADYGMATY PROGRAMOWANIA Wykład 4

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

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

Wykład 5: Klasy cz. 3

Programowanie Obiektowe i C++

TEMAT : KLASY DZIEDZICZENIE

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Podstawy Programowania Obiektowego

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

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

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

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

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

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

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Szablony funkcji i klas (templates)

Język C++ umożliwia przeciążanie operatora, tzn. zmianę jego znaczenia na potrzeby danej klasy. W tym celu definiujemy funkcję o nazwie:

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

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

Programowanie w C++ - wybrane przykłady szablonów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ

Rozdział 4 KLASY, OBIEKTY, METODY

Programowanie obiektowe i C++ dla matematyków

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Przeciążanie operatorów

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

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

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

Wyjątki (exceptions)

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

Język C++ zajęcia nr 2

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Spis treści PROGRAMOWANIE OBIEKTOWE W JĘZYKU C++: FUNKCJE ZAPRZYJAŹNIONE Z KLASĄ, PRZEŁADOWANIE OPERATORÓW. Informatyka 2

Wykład 8: klasy cz. 4

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

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Podstawy Programowania Obiektowego

Abstrakcyjny typ danych

Informatyka 2. Wykład nr 3 ( ) Politechnika Białostocka. - Wydział Elektryczny. dr inŝ. Jarosław Forenc

Programowanie obiektowe. Wykład 5. C++: szablony

Język C++ wykład VIII

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

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

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

Szablony funkcji i szablony klas

Podstawy Programowania Obiektowego

10. Programowanie obiektowe w PHP5

Języki i techniki programowania Ćwiczenia 4 Wzorce

Stos liczb całkowitych

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

Dziedziczenie jednobazowe, poliformizm

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

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

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

Programowanie, część I

Klasy i obiekty cz I Klasy, obiekty, podstawy używania obiektów

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

Lab 9 Podstawy Programowania

Programowanie i struktury danych

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Przeciążenie operatorów

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

Programowanie komputerowe. Zajęcia 7

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Laboratorium 1. Wprowadzenie, środowisko programistyczne, pierwsze programy

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

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

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Część 4 życie programu

Laboratorium nr 10. Temat: Funkcje cz.2.

Klasa, metody, rozwijanie w linii

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

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

11.6 Klasa do obsługi liczb wymiernych

Konstruktor kopiujacy

Język C++ Programowanie obiektowe

Programowanie obiektowe w C++ Wykład 12

Zad. 5: Układ równań liniowych liczb zespolonych

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

Języki i paradygmaty programowania

Zaawansowane programowanie w C++ (PCP)

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

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

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

Transkrypt:

C++ i wzorce w klasach Andrzej Przybyszewski numer albumu: 89810 14 listopada 2009

Ogólnie Przeładowanie (przeciążanie) operatorów polega na nadaniu im nowych funkcji. Przeładowanie operatora dokonuje się definiując swoją własną funkcję która:

Ogólnie Przeładowanie (przeciążanie) operatorów polega na nadaniu im nowych funkcji. Przeładowanie operatora dokonuje się definiując swoją własną funkcję która: nazywa się operator@ gdzie znaczek @ to symbol operatora, o którego przeładowanie nam chodzi (np. +,-,* itp.)

Ogólnie Przeładowanie (przeciążanie) operatorów polega na nadaniu im nowych funkcji. Przeładowanie operatora dokonuje się definiując swoją własną funkcję która: nazywa się operator@ gdzie znaczek @ to symbol operatora, o którego przeładowanie nam chodzi (np. +,-,* itp.) jako co najmniej jeden z argumentów, przyjmuje obiekt danej klasy lub referencję do takiego obiektu.

Ogólnie Przeładowanie (przeciążanie) operatorów polega na nadaniu im nowych funkcji. Przeładowanie operatora dokonuje się definiując swoją własną funkcję która: nazywa się operator@ gdzie znaczek @ to symbol operatora, o którego przeładowanie nam chodzi (np. +,-,* itp.) jako co najmniej jeden z argumentów, przyjmuje obiekt danej klasy lub referencję do takiego obiektu. Nie możemy przeładowywać operatorów dla typów wbudowanych (int, char, float).

Konstrukcja Konstrukcja: typ_zwracany operator@ (argumenty) { // operacje }

Operatory Operatory które można przeładować: + - * / % & ^ << << ~ &&! ==!= < <= > >= += -= *= /= %= &= = ^= <<= >>= ++ -- = -> ->* () [] new delete, Trzeba zapamiętać że można przeciążać TYLKO te operatory. Próba przeciążania innych (jak i tworzenia nowych jak np @) skończy się błędem.

Operatory Operatory które można przeładować: + - * / % & ^ << << ~ &&! ==!= < <= > >= += -= *= /= %= &= = ^= <<= >>= ++ -- = -> ->* () [] new delete, Trzeba zapamiętać że można przeciążać TYLKO te operatory. Próba przeciążania innych (jak i tworzenia nowych jak np @) skończy się błędem. NIE można zmieniać priorytetu wykonywania tych operatorów! np. a + b + c zostanie wykonane zgodnie z matematycznym punktem widzenia (a + b) + c, za to a + b * c jako a + (b * c) w tym wypadku.

Przykład - liczby zespolone 1 Przykład: class LZESPOLONA{ public: LZESPOLONA(); LZESPOLONA(float, float); LZESPOLONA operator+(lzespolona); LZESPOLONA operator-(lzespolona); LZESPOLONA operator*(lzespolona); LZESPOLONA operator+=(lzespolona); LZESPOLONA operator-=(lzespolona); LZESPOLONA operator*=(lzespolona); private: float a; float b; };

Przykład - liczby zespolone 2 Mamy daną klasę definiującą liczbę zespoloną, gdzie a to część rzeczywista a b to część urojona. Jak widać mamy podane w sekcji public funkcje przeładowujące operatory arytmetyczne. Przykład: //konstruktory LZESPOLONA::LZESPOLONA(float a1, float b1) {a = a1; b = b1;} LZESPOLONA::LZESPOLONA() {a = 0; b = 0;} Chcemy teraz wykonywać działania na tych liczbach bez wielokrotnego dobierania się do składowych a i b i wykonywania nieco żmudnego podstawiania do wzorów.

Przykład - liczby zespolone 3 Przykład: LZESPOLONA LZESPOLONA::operator+( LZESPOLONA B) { return LZESPOLONA(a+B.a, b+b.b); } LZESPOLONA LZESPOLONA::operator-( LZESPOLONA B) {return LZESPOLONA(a-B.a, b-b.b); } W prosty sposób przeładowaliśmy operatory + i - dzięki czemu można wykonać dodawanie i odejmowanie liczb zespolonych. Przedstawiony sposób odnosi się do funcji operatorowych jako niestatycznych składowych klasy, przyjmuje ona wtedy tylko jeden parametr dla operatorów dwuargumentowych.

Przykład - liczby zespolone 4 Możemy także mieć funkcje operatorowe jako funkcje nie-składowe(globalne) wtedy potrzebujemy dwóch argumentów: Przykład: LZESPOLONA operator+(lzespolona A, LZESPOLONA B) { return LZESPOLONA(A.a+B.a, A.b+B.b); } LZESPOLONA operator*(lzespolona A, LZESPOLONA B) { return LZESPOLONA((A.a*B.a-B.b*A.b),(A.b*B.a+A.a*B.b); } Taką funkcję możemy dołączyć do klasy za pomocą friend, lub nie musi być ona składową klasy, jeżeli potrafi wykonywać operacje na obiektach danej klasy.

Przykład - liczby zespolone 5 Kożystając z operatorów arytmetycznych warto zdefiniować sobie operatory wykonujące operacje+przypisanie(dopisanie) czyli np. +=, -=, *=, działają one tak jak a = a + b, jak widać zamiast przepisywać a do którego chcemy dopisać coś, można użyć a+=b, definiując nową klasę takie operatory trzeba również zdefiniować (np. jeżeli przeładujemy operator+ to nie stworzy nam się domyślnie działający += co mogłoby się czasem wydawać). Przykład: LZESPOLONA LZESPOLONA::operator+=( LZESPOLONA B) {a = a + B.a; b = b + B.b;} LZESPOLONA LZESPOLONA::operator-=( LZESPOLONA B) {a = a - B.a; b = b - B.b;}

Przykład - liczby zespolone 6 Jak wcześniej pokazano przeładować możemy wiele operatorów (niektórych nie można ale są one raczej mało istotne), każdemu operatorowi możemy nadać nowe właściwości, niekoniecznie musi on robić coś pochodnego od macierzystego przeznaczenia (+ niekoniecznie musi coś dodawać, wszystko zależy od nas). Mały przykład: int main(){ LZESPOLONA a(3,2), b(8, 12.3),c; c = a + b; c = a - b; c += a; //itp... }

Ogólnie Wzorce są jednym z najsilniejszych narzędzi. Zgodnie ze swoim przeznaczeniem, powinny służyć do tego, aby maksymalnie skrócić konieczność pisania i powtarzania tych samych sekwencji. Wzorce ściśle się trzymają konwencji języka, czego konsekwencją jest to, że mamy do dyspozycji dwa podstawowe rodzaje wzorców: wzorzec funkcji i wzorzec klasy. Definicja wzorca: template < parametry-wzorca > definicja-wzorca

Wzorce we wzorcach Parametry wzorca są wyjątkowo w nawiasach ostrych. Parametry te przypominają właściwie argumenty funkcji, z tym, że na liście parametrów może wystąpić parametr typu, który zazwyczaj nazywa się class. Oczywiście parametr wzorca może być również np. typu size_t, ale class jest to niewątpliwie wzorców najmocniejsza strona. Jeśli chodzi o kwestie składniowe to: jeśli jednym z parametrów wzorca jest jakiś inny konkretyzowany wzorzec, to NIGDY nie wolno pisać: Definicja wzorca: wz1<costam,wz2<int>> Należy pisać pamiętając żeby rozdzielać ostre nawiasy: > >.

Wzorce funkcji i klas Wzorce(szablony) można zastosować do funckji jak i klas(struktur). Wzorzec funkcji: template <class T> inline const T& Min( const T& t1, const T& t2 ) { if ( t1 < t2 ) return t1; return t2; } Wzorzec funkcji inline Min która zwraca element mniejszy. Powinniśmy dostać z tego wzorca: Wzorzec funkcji: inline const int& Min( const int&, const int& );

Wzorce klas 1 Zajmijmy się szablonami klas. Wzorzec klasy: template <class parametr> class figura {parametr wysokosc; parametr krawedz1; parametr krawedz2;}; Do szablonu podajemy klasę jakąś, potem możemy ją wykorzystać w nowej klasie tworzonej w szablonie. Tak możemy stworzyć nową klasę figura której parametry są typu int. nowy obiekt: figura<int> trapez;

Wzorce klas 2 Rozbuduwując naszą klasę we wzrocu: Wzorzec klasy: template <class parametr> class figura { private: parametr wysokosc;... //inne parametry public: parametr wez_wysokosc ();... // reszta funkcji zwracających void wpisz_wysokosc (parametr);... //reszta funkcji wypisujących}; Mamy tu kilka funkcji, trzeba je teraz oprogramować.

Wzorce klas 3 Zaimplementujmy teraz funkcje w szablonie klasy: Funkcje szablonu klasy: template<class parametr> parametr figura<parametr>::wez_wysokosc () { return wysokosc; }... // reszta funkcji typu parametr template<class parametr> void figura<parametr>::wpisz_wysokosc (parametr wys) { wysokosc = wys; }... //reszta funkcji

Wzorce klas 4 Definicja funkcji składowej szablonu klasy trochę przypomina definicję szablonu funkcji. Zaczynamy od słówka template i nawiasów trójkątnych zawierających parametry szablonu. Następnie podajemy rezultat zwracany przez definiowaną funkcję. Dalej jest nazwa klasy wraz z nawiasami trójkątnymi. W nich ponownie umieszczamy wszystkie parametry szablonu. Kolejny jest operator zakresu i wreszcie nazwa funkcji. Zauważmy jednak, że po nazwie funkcji podajemy jedynie nazwę parametru! Niema tam już słówka class.

Klasy specjalizowane Specjalizowana wersja szablonu klas, jest to specjalna definicja klasy która zostanie dopasowana przez szablon gdy nastąpi odpowiednie wywołanie. Czyli np. dla typu int* możemy napisać osobną klasę która zostanie utworzona poprzez szablon: Funkcje szablonu klasy: class figura<int *> { //składniki szablonu klas }; //funkcja składowa void figura<int*>::wpisz_wysokosc (int * wys) { wysokosc = *wys; }

Nowy obiekt Jak wcześniej wspomniano, mając już cały szablon klasy, możemy na jego podstawie utworzyć nowy obiekt np. klasy utworzonej wcześniej z liczb zespolonych: Funkcje szablonu klasy: figura<lzespolona> kwadrat; kwadrat.wpisz_wysokosc(lzespolona(2, 4)); //oczywiście figura i liczby zespolone //nie za bardzo do siebie pasują

STL W standardzie języka C++ wprowadzono biblioteki standardowych szablonów, są to szablony na podstawie których możemy tworzyć najczęstsze struktury danych, na podstawie dowolnych obiektów. Niektóre elementy STL a: Vector: vector<lzesoplona> zesptab;//tablica dynamiczna List: list<lzespolona> listazesp;//lista dwukierunkowa Stack: stack<zespolona> zespstos;//stos