temat 8
Transkrypt
temat 8
Tematyka wykładów 1. Wprowadzenie. Klasy – cz. 1 2. Klasy – cz. 2 3. 4. 5. 6. 7. 8. Funkcje operatorowe. Wskaźnik this Dziedziczenie Polimorfizm i funkcje wirtualne Szablony Strumienie Tworzenie aplikacji w systemie Windows - Język C++. Programowanie obiektowe - Klasy i obiekty - Budowa i deklaracja klasy. Prawa dostępu - Pola i funkcje składowe - Konstruktor i destruktor - Tworzenie obiektów - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne Szablony • • • Szablony klas Szablony funkcji Kontenery (pojemniki) Szablony klas Szablon klasy (klasa wzorcowa), to klasa uogólniona (klasa sparametryzowana), która pozwala na definiowanie klas dla różnych typów danych przechowywanych w polach składowych. W definicji szablonu klasy, parametrem jest typ danych pola składowego klasy. Deklaracja szablonu klasy template <param1, param2, ...> class nazwa { // ciało klasy }; Parametry opisujące typ danych mają postać: class nazwa_typu_uogólnionego Przykład deklaracji szablonu klasy Nazwa typu uogólnionego Nazwa szablonu klasy template <class T> class Tablica { // ciało szablonu klasy Tablica }; Przykład deklaracji szablonu klasy template <class T> class Tablica { public: Tablica(int n = 10); ~Tablica(); T& operator [] (int i); // konstruktor // destruktor // op. indeksowania private: T* t; // wskaznik na tablice danych typu T int rozmiar; // rozmiar tablicy }; Przykład definicji szablonu klasy // konstruktor template <class T> Tablica<T>::Tablica(int n) { rozmiar = n; t = new T[rozmiar]; // tablica danych typu T } // destruktor template <class T> Tablica<T>::~Tablica() { delete []t; } // operator indeksowania template <class T> T& Tablica<T>::operator [] (int i) { return t[i]; } Przykład użycia szablonu klasy Konkretyzacja szablonu klasy – następuje w momencie tworzenia obiektu. W miejsce parametrów podajemy typ danych Tablica <float> a(20); for (int i = 0; i < 20; i++) { a[i] = i * 3.14; cout << a[i] << endl; } Tablica <Punkt> pkt(5); for (int i = 0; i < 5; i++) { pkt[i] = Punkt(i, 2*i); cout << pkt[i] << endl; } Tablica <zesp> z(); for (int i = 0; i < 10; i++) { z[i] = zesp(i*2, 1); cout << z[i] << endl; } Szablony funkcji Szablon funkcji, to funkcja uogólniona, która pozwala na definiowanie funkcji dla różnych typów danych przetwarzanych przez tę funkcję. Rodzina funkcji różniących się typem argumentów i/lub typem zwracanego wyniku. W definicji szablonu funkcji, parametrem jest typ danych argumentu funkcji. Przykład definicji szablonu funkcji int max(int x, int y) { return (x > y) ? x : y; } long max(long x, long y) { return (x > y) ? x : y; } zesp max(zesp x, zesp y) { return (x > y) ? x : y; } W klasie zesp konieczny operator > Przykład definicji szablonu funkcji template <class T> T max ( T& x, T& y ) { return (x > y) ? x : y; } Szablon funkcji może być użyty dla wszystkich typów danych, pomiędzy którymi zdefiniowana jest relacja większości > Przykład definicji szablonu funkcji template <class T> char* porownaj( T obiekt1, T obiekt2) { if (obiekt1 = = obiekt2) return "takie same\n"; else return "rozne\n"; } Konkretyzacja szablonu funkcji Konkretyzacja szablonu funkcji – następuje w momencie wywołania funkcji. int !! i = 4, j = 4; cout << porownaj(i, j); float x = 3.5, y = 4.5; cout << porownaj(x, y); char c1 = 'a', c2 = 'a'; cout << porownaj(c1, c2); int *w1 = &i, *w2 = &i; cout << porownaj(w1, w2); zesp z3(1, 1), z4(1, 2); cout << porownaj(z3, z4); punkt p1(0, 0), p2(0, 0); cout << porownaj(p1, p2); Kontenery (pojemniki) Kontenery, to klasy sparametryzowane (szablony) służące do przechowywania i udostępniania danych. vector - tablica dynamiczna (dostęp do elementów za pomocą indeksu). vector<bool> - specjalna wersja kontenera vector , operująca na bitach pamięci. list - lista elementów (efektywne wstawianie i usuwanie). stack - stos (dostęp tylko do wierzchołka stosu). queue - kolejka (wstawianie na końcu, usuwanie z początku). deque - kolejka dwukierunkowa (wstawianie i usuwanie z obu końców). priority queue set - kolejka priorytetowa (do operacji na dużych elementach). - zbiór (brak kolejności elementów, operacje zawierania, dołączania i usuwania). multiset - kontener set z powtarzającymi się elementami. bitset - kontener set ze zoptymalizowanym sposobem przechowyw. wartości binarnych. map - mapa (dostęp do wartości poprzez unikatowy klucz). multimap- mapa (klucz może się powtarzać). string - przechowywanie i operacje na łańcuchach znakowych. Kontener vector Plik nagłówkowy <vector> vector<double> x; // pusta tablica vector<int> a(10, 0); // 10-el. zerowych Wybrane metody klasy vector: size - zwraca liczbę elementów w wektorze insert - wstawia nowy element przed podaną pozycję push_back - wstawia nowy element na koniec tablicy erase - usuwa element z podanej pozycji clear - usuwa wszystkie elementy z wektora. ..... i funkcje implementujące różne algorytmy (sortowanie, odwracanie kolejności, permutacje itd...)