Tematyka wykładów 1. Wprowadzenie. Klasy cz. 1 - 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 2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne 3. Funkcje operatorowe. Wskaźnik this 4. Dziedziczenie 5. Polimorfizm i funkcje wirtualne 6. Szablony 7. Strumienie 8. Tworzenie aplikacji w systemie Windows
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); // konstruktor ~Tablica(); // destruktor T& operator [] (int i); // 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 vector<bool> list stack queue deque priority queue set - tablica dynamiczna (dostęp do elementów za pomocą indeksu). - specjalna wersja kontenera vector, operująca na bitach pamięci. - lista elementów (efektywne wstawianie i usuwanie). - stos (dostęp tylko do wierzchołka stosu). - kolejka (wstawianie na końcu, usuwanie z początku). - kolejka dwukierunkowa (wstawianie i usuwanie z obu końców). - 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 map - kontener set ze zoptymalizowanym sposobem przechowyw. wartości binarnych. - mapa (dostęp do wartości poprzez unikatowy klucz). multimap- mapa (klucz może się powtarzać). string - przechowywanie i operacje na łańcuchach znakowych.
Plik nagłówkowy <vector> Kontener 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...)