Programowanie obiektowe C++

Podobne dokumenty
Programowanie obiektowe C++

Programowanie w C++ Wykład 7. Katarzyna Grzelak. 23 kwietnia K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40

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

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Programowanie i struktury danych

Szablony funkcji i szablony klas

Szablony funkcji i klas (templates)

Technologie programowania Wykład 4. Szablony funkcji Notes. Szablony funkcji Notes. Szablony funkcji Notes. Notes. Przemek Błaśkiewicz.

STL Standardt Template Library (wprowadzenie)

Szablony. Szablony funkcji

Programowanie obiektowe C++

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

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

Język C++ wykład VIII

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

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Stos liczb całkowitych

Programowanie obiektowe C++

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

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów szablony funkcji

Programowanie w języku C++

Szablony klas, zastosowanie szablonów w programach

Standard C++0x (C++1x?) Marcin Świderski

Podstawy programowania skrót z wykładów:

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

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

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

STL: Lekcja 1&2. Filozofia STL

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

Programowanie obiektowe C++

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

Zaawansowane programowanie w C++ (PCP)

Dzisiejszy wykład. Wzorce funkcji Wzorce klas Tablica asocjacyjna Składowe statyczne

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

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Abstrakcyjny typ danych

Aby uzyskać zaliczenie w pierwszym terminie (do 30 stycznia 2018) rozliczyć trzeba co najmniej 8 projektów, po 4 z każdej z części: C++ oraz Python.

Programowanie, część I

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

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

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

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

10.1 Szablony Szablony funkcji Szablony klas Szablony jako wstęp do biblioteki STL... 10

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

Oracle PL/SQL. Paweł Rajba.

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

Podstawy Programowania Obiektowego

Kurs programowania. Wykład 9. Wojciech Macyna

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

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

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

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Technologie cyfrowe semestr letni 2018/2019

Paradygmaty programowania. Paradygmaty programowania

Wprowadzenie do szablonów klas

Programowanie obiektowe w C++ Wykład 12

Wzorce funkcji (szablony)

Szablon klasy std::list

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Technologie cyfrowe semestr letni 2018/2019

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

Programowanie obiektowe

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

PARADYGMATY PROGRAMOWANIA Wykład 4

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Programowanie Obiektowo Zorientowane w języku C++ Biblioteka STL

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

Programowanie i struktury danych

Klasy generyczne. ZbiórLiczb. ZbiórCzegokolwiek. Zbiór

Zaawansowane programowanie w C++ (PCP)

Programowanie obiektowe C++

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

Część 4 życie programu


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

Szablon klasy std::vector

Paradygmaty programowania

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Programowanie obiektowe C++

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

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

Podstawy programowania w języku C++

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

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

PARADYGMATY PROGRAMOWANIA Wykład 3

Języki programowania obiektowego Nieobiektowe elementy języka C++

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

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

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

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

Języki programowania, wtorek , 12:15-13:45 Zadanie 11 - ostatnie

Algorytmy i Struktury Danych. Anna Paszyńska

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

Języki programowania

STL: kontenery. STL: kontenery. STL: kontenery. Typy kontenerów STL. STL: kontenery. STL: kontenery. multimap. Kontener map: przykład zadanie:

Język ludzki kod maszynowy

Wydajność użycia funktorów z biblioteką STL języka C++

Transkrypt:

Programowanie obiektowe C++ Programowanie zorientowane obiektowo Wykład 5 Witold Dyrka witold.dyrka@pwr.wroc.pl 19/12/2011

Prawa autorskie itp. Wiele slajdów do tego wykładu powstało w oparciu o slajdy Bjarne Stroustrupa do kursu Foundations of Engineering II (C++) prowadzonego w Texas A&M Universityhttp://www.stroustrup.com/Programming (tym razem większość wykładu:-)

Program wykładów 0. Bezpieczeństwo typów. Kontener vector. Obsługa błędów (26/09/2011) 1. Abstrakcja i enkapsulacja: klasy i struktury. Typ wyliczeniowy (10/10/2011) 2. Polimorfizm: przeładowanie funkcji i operatorów (24/10/2011) 3. Zarządzanie pamięcią: konstruktory, destruktory, przypisanie Konwersje (21/11/2011) 4. Dziedziczenie (05/12/2011) 5. Programowanie uogólnione: szablony (19/12/2011) 6. Projektowanie programów orientowanych obiektowo (02/01/2012) 7. Kolokwium zaliczeniowe (16/01/2012)

Plan na dziś Szablony funkcji definicja, konkretyzacja, specjalizacja Szablony klas Programowanie uogólnione Standardowa biblioteka szablonów STL Iteratory

Klasa vector liczb double class vector { // an almost real vector of doubles int sz; // the size double* elem; // a pointer to the elements int space; // size+free_space public: vector() : sz(0), elem(0), space(0) { } // default constructor explicit vector(int s) :sz(s), elem(new double[s]), space(s) { } // constructor vector(const vector&); // copy constructor vector& operator=(const vector&); // copy assignment ~vector() { delete[ ] elem; } // destructor double& operator[ ](int n) { return elem[n]; } // access: return reference int size() const { return sz; } // current size void resize(int newsize); void push_back(double d); void reserve(int newalloc); int capacity() const { return space; } }; // grow (or shrink) // add element // get more space // current available space

Szablony vector liczb double jest świetny... Ale potrzebujemy wektorów elementów dowolnego typu: vector<double> vector<int> vector<month> vector<record*> // vector of pointers vector< vector<record> > // vector of vectors vector<char> Chcemy by typ elementu był parametrem vector-a by vector mógł przechowywać elemeny typów wbudowanych oraz typów użytkownika Nie jest to żadna magia kompilatora możemy definiować swoje własne typy i funkcje sparametryzowane, czyli szablony

Zacznijmy od szablonów funkcji Przykład 1 max dwóch zmiennych: opcja 1: polimorfizm long maks(long a, long b) { return (a>b?a:b); } double maks(double a, double b) { return (a>b?a:b); } char maks(char a, char b) { return (a>b?a:b); } opcja 2: szablon (template) template <class T> T maks(t a, T b) { return (a>b?a:b); }

Szablony funkcji - składnia Definicja szablonu: template <class T> T maks(t a, T b) {... } lub template <typename T> T maks(t a, T b) {... } Konkretyzacja: cout << maks('a','b'); cout << maks(1,2); cout << maks<int>(1,2); UWAGI: T może być dowolnym typem: prostym strukturą klasą szablonem class i typename używamy zamiennie

Konkretyzacja szablonu funkcji Przykłady: cout << maks('a','b'); # b cout << maks(1,2); # 2 cout << maks(1.1,2.2); # 2.2 cout << maks(1,2.2); cout << maks<float>(1,2.2); # 2.2 # Błąd: niejednoznaczny typ cout << maks( leon, jan ); # wynik zależny od... adresów łańcuchów!

Specjalizacja szablonu funkcji template <class T> T maks(t a, T b) { return (a>b?a:b); } template <> char* maks(char* a, char* b) { return (strcmp(a,b)>0?a:b); } cout << maks( leon, jan ); # bez zmian! czy ktoś ma pomysł? cout << maks<char*>( leon, jan ); # leon - działa! kompilator odróżnia const char* od char*

Szablony funkcji Kiedy? te same operacje na różnych typach danych przeważnie służące do operowania na zbiorach, np. sortowanie, porównywanie itp. szeroko stosowane w standardowej bibliotece szablonów STL Dlaczego? elastyczne i szybkie krótszy, łatwiejszy do pielęgnacji kod bezpieczniejsze niż rzutowanie typów

Wróćmy do klasy vector, czyli szablony klas // an almost real vector of Ts: template <class T> class vector { // for all types T int sz; // the size T* elem; // a pointer to the elements int space; // size+free_space public: vector() : sz(0), elem(0), space(0) { } // default constructor explicit vector(int s) :sz(s), elem(new T[s]), space(s) { } // constructor vector(const vector&); // copy constructor vector& operator=(const vector&); // copy assignment ~vector() { delete[ ] elem; } // destructor }; T& operator[ ] (int n) { return elem[n]; } // access: return reference int size() const { return sz; } // the current size //

Szablon vector-a i jego konkretyzacja // an almost real vector of Ts: template<class T> class vector { // }; vector<double> vd; // T is double vector<int> vi; // T is int vector< vector<int> > vvi; // T is vector<int> // in which T is int vector<char> vc; // T is char vector<double*> vpd; // T is double* vector< vector<double>* > vvpd; // T is vector<double>* // in which T is double

vector<double> to po prostu // an almost real vector of doubles: class vector { int sz; // the size double* elem; // a pointer to the elements int space; // size+free_space public: vector() : sz(0), elem(0), space(0) { } // default constructor explicit vector(int s) :sz(s), elem(new double[s]), space(s) { } // constructor vector(const vector&); // copy constructor vector& operator=(const vector&); // copy assignment ~vector() { delete[ ] elem; } // destructor }; double& operator[ ] (int n) { return elem[n]; } // access: return reference int size() const { return sz; } // the current size //

A vector<char> to: // an almost real vector of chars: class vector { int sz; // the size char* elem; // a pointer to the elements int space; // size+free_space public: vector() : sz(0), elem(0), space(0) { } // default constructor explicit vector(int s) :sz(s), elem(new char[s]), space(s) { } // constructor vector(const vector&); // copy constructor vector& operator=(const vector&); // copy assignment ~vector() { delete[ ] elem; } // destructor char& operator[ ] (int n) { return elem[n]; } // access: return reference int size() const { return sz; } // the current size // };

Parametry szablonów klas kilka parametrów typu inne parametry (nie typu) template <typename T, typename S = char, int rozmiar=10> class dwulista { T kolumna1[rozmiar]; S kolumna2[rozmiar]; parametry nie typu w klasie są stałe public: void wloz(int poz, T pole1, S pole2) { if (poz>=0&&poz<rozmiar) { kolumna1[poz] = pole1; kolumna2[poz] = pole2; } else throw runtime_error("poza zakresem!"); }; T wez1(int poz) { if (poz>=0&&poz<rozmiar) return(kolumna1[poz]); else throw runtime_error("poza zakresem!"); }; S wez2(int poz) { if (poz>=0&&poz<rozmiar) return(kolumna2[poz]); else throw runtime_error("poza zakresem!"); }; }; wszystkie parametry mogą posiadać wartości domyślne

Inne cechy szablonów klas Szablony klas można specjalizować: szablon ogólny: template <typename T> class element{ }; specjalizacja: template <> class element<char> { }; Szablony klas można częściowo specjalizować: template <class gatunek1, class gatunek2> class krzyzowka { }; template <class gatunek1> class krzyzowka<gatunek1, ecoli> { };...jeśli kompilator pozwala... Każda wygenerowana w wyniku instancjacji klasa ma oddzielną kopię składników statycznych: static int element<char>::ileobiektow oraz są od siebie niezależne!! static int element<double>::ileobiektow

Szablony klas Kiedy? obsługa klas będących kontenerami (pojemnikami) obiektów lub innych danych Przykłady: zbiór łańcuchów różnego typu stos dowolnych elementów kolejki, wektory, listy, tablice...

Szablony klas (2) sparametryzowana klasa w momencie podstawienia parametrów (konkretyzacji szablonu) kompilator generuje klasę lub jej metodę szablony klas można specjalizować dla parametru stosować do pisania klas obsługujących kontenery (pojemniki) obiektów różnych typów krótszy i łatwiejszy do pielęgnacji kod w zasadzie komplementarne do obiektowości

Każda róża ma kolce Problemy kiepska diagnostyka błędów często naprawdę kiepskie komunikaty o błędach często dopiero w momencie konsolidacji wszystkie szablony muszą być w pełni zdefiniowane w każdej jednostce translacji umieszczaj definicje szablonów w plikach nagłówkowych Bjarne S. radzi używaj bibliotek opartych na szablonach takich jak standardowa biblioteka szablonów (STL) C++ np.., vector, sort() początkowo pisz tylko proste szablony aż nie zdobędziesz doświadczenia

Idźmy dalej... Umiemy już pisać klasy i funkcje, które zachowują się bardzo podobnie niezależnie od używanych typów danych używanie int-a nie różni się zbyt wiele od używania double-a używanie vector<int> nie różni się zbyt wiele od używania vector<string> Chcielibyśmy pisać programy w taki sposób, że nie musielibyśmy powtarzać pracy za każdym razem, kiedy stworzymy nowy rodzaj kontenera albo nieco zmodyfikujemy sposób interpretacji danych

Ideały Chcielibyśmy pisać programy w taki sposób, że nie musielibyśmy powtarzać pracy za każdym razem, kiedy stworzymy nowy rodzaj kontenera albo nieco zmodyfikujemy sposób interpretacji danych szukanie wartości w wektorze nie różni się zbyt wiele od szukania wartości w liście lub w tablicy szukanie łańcucha bez względu na wielkość liter nie różni się zbyt wiele od szukania łańcucha z uwzględnieniem wielkości liter rysowanie dokładnych wartości danych eksperymentalnych nie różni się zbyt wiele od rysowania wartości zaokrąglonych Kopiowanie pliku nie różni się zbyt wiele od kopiowania wektora

Ideały (2) Kod ma być: łatwy do czytania i łatwy do modyfikacji regularny, krótki, szybki Spójny dostęp do danych niezależnie jak są przechowywane, niezależnie od ich typu bezpieczeństwo typów Zwarte przechowywanie danych Szybkie operacje dostęp do danych, dodawanie i usuwanie danych Standardowe wersje najbardziej popularnych algorytmów kopiowanie, szukanie, sortowanie, sumowanie itp.

Programowanie ogólne Pisanie kodu, który może działać z różnymi typami przekazywanymi do niego jako argumenty, pod warunkiem, że typy te spełniają określone wymagania syntaktyczne I semantyczne Celem (dla użytkownika takiego kodu) jest Większa poprawność dzięki lepszej specyfikacji Szerszy zakres zastosowań możliwość ponownego wykorzystania Lepsza wydajność dzięki szerszemu użyciu optymalnych bibliotek pozbycie się niepotrzebnie wolnego kodu Od konkretu do abstrakcji W przeciwnym wypadku kod często puchnie 24

Przykład uogólniania (konkretne algorytmy) double sum(double array[], int n) // one concrete algorithm (doubles in array) { double s = 0; for (int i = 0; i < n; ++i ) s = s + array[i]; return s; } struct Node { Node* next; int data; }; int sum(node* first) { int s = 0; while (first) { s += first->data; first = first->next; } return s; } // another concrete algorithm (ints in list) 25

Przykład uogólniania (abstrakcyjna struktura danych) // pseudo-code for a more general version of both algorithms int sum(data) // somehow parameterize with the data structure { int s = 0; // initialize while (not at end) { // loop through all elements s = s + get value; // compute sum get next data element; } return s; // return result } Potrzebujemy trzech operacji na strukturze danych: sprawdzenie czy doszliśmy do końca (not at end) pobieranie wartości (get value) pobieranie kolejnego elementu (get next data element) 26

Przykład uogólniania (wersja STL) // Concrete STL-style code for a more general version of both algorithms template<class Iter, class T> T sum(iter first, Iter last, T s) { while (first!=last) { s = s + *first; ++first; } return s; } Niech użytkownik inicjuje akumulator: float a[] = { 1,2,3,4,5,6,7,8 }; double d = 0; d = sum(a,a+sizeof(a)/sizeof(*a),d); // Iter should be an Input_iterator // T should be something we can + and = // T is the accumulator type 27

Standardowa biblioteka szablonów Część biblioteki standardowej C++ Główny cel najbardziej ogólna, wydajna i elastyczna reprezentacja koncepcji (idei, algorytmów) oddzielne koncepcje oddzielnie w kodzie dowolne łączenie koncepcji tam gdzie ma to sens Aby programowanie było jak matematyka w myśl zasady: dobre programowanie jest matematyką twórcą jest Rosjanin, Aleksander Stiepanow

STL ok. 10 kontenerów i 60 algorytmów plus dodatkowe kontenery i algorytmy Boost.org, Microsoft, SGI, dokumentacja: SGI: http://www.sgi.com/tech/stl/ (jasny opis) Dinkumware: http://www.dinkumware.com/refxcpp.html (uwaga na kilka wersji biblioteki) Rogue Wave: http://www.roguewave.com/support/docs/sourcepro/stdlibug/index.html Microsoft: http://msdn.microsoft.com/en-us/library/y097fkab.aspx C++ Templates Tutorial: http://www.iis.sinica.edu.tw/~kathy/vcstl/templates.htm

Podstawowy model STL Algorytmy sort, find, search, copy, Kontenery iterators vector, list, map, hash_map, Separacja Algorytmy operują na danych, ale nie wiedzą nic o kontenerach Kontenery przechowują dane, ale nie wiedzą nic o algorytmach Algorytmy i kontenery współpracują poprzez iteratory Każdy kontener ma swoje własne typy iteratorów

Iteratory Para iteratorów definiuje sekwencję Początek (wskazuje na pierwszy element jeśli istnieje) Koniec (wskazuje na element za ostatnim elementem) begin: end: Iterator jest typem, który udostępnia operacje iteratorowe: ++ idź do następnego elementu * pobierz wartość == sprawdź czy dwa iteratory wskazują na ten sam element Niektóre iteratory udostępniają więcej operacji (np. --, + i [ ])

Najprostszy algorytm: find() begin: // Find the first element that equals a value template<class In, class T> In find(in first, In last, const T& val) { while (first!=last && *first!= val) ++first; return first; } void f(vector<int>& v, int x) // find an int in a vector { vector<int>::iterator p = find(v.begin(),v.end(),x); if (p!=v.end()) { /* we found x */ } // } end: Możemy pominąć różnice pomiędzy kontenerami

find() ogólny zarówno dla typu elementów jak i kontenera void f(vector<int>& v, int x) // works for vector of ints { vector<int>::iterator p = find(v.begin(),v.end(),x); if (p!=v.end()) { /* we found x */ } // } void f(list<string>& v, string x) // works for list of strings { list<string>::iterator p = find(v.begin(),v.end(),x); if (p!=v.end()) { /* we found x */ } // } void f(set<double>& v, double x) // works of set of doubles { set<double>::iterator p = find(v.begin(),v.end(),x); if (p!=v.end()) { /* we found x */ } // }

Algorytmy i iteratory Iterator wskazuje (odnosi się do, oznacza) element w sekwencji Koniec sekwencji to jeden za ostatnim elementem nie ostatni element konieczne by elegancko reprezentować pustą sekwencję jeden-za-ostatnim-elementem nie jest elementem możesz porównać iterator odnoszący się do niego nie możesz wyłuskać go (przeczytać jego wartości) Zwrócenie końca sekwencji oznacza nieznalezienie lub niepowodzenie operacji jakiś iterator: the end: Pusta sekwencja 0 1 2 3

Dziś najważniejsze było... Szablony funkcji i klas pojęcia: parametryzacja, konkretyzacja, specjalizacja Programowanie ogólne piękno matematyki w programowaniu Używaj bibliotek opartych na szablonach np. STL Iteratory

A po Nowym Roku... 2.01 godziny rektorskie (wykład się nie odbędzie) materiały do wykładu 6 na stronie www nie będą jednak obowiązywały do kolokwium 16.01 kolokwium zaliczeniowe przykładowe zadania pojawią się na początku roku