
lk_oop-c_7-11.ppt
- Количество слайдов: 10
Лекция № 7 по дисциплине «Объектно-ориентированное программирование» на тему: Шаблоны
Понятие шаблонов Шаблоны — это обобщенные определения классов и функций. Шаблоны также называют параметризованными типами. Шаблоны дают возможность определить набор перегруженных функций – шаблонных функций, или набор родственных классов – шаблонных классов.
Шаблоны функций П р и м е р. Шаблон функции поиска максимума template < class T> T maximum(T a, T b) { return a>b ? a : b; } void main(){ int m = maximum(3, 5); long l= maximum(3333, 5555); float f = maximum(3. 5, 5. 5); char ch= maximum(“a”, “b”); char* c= maximum(“bbbbb”, “aaaaaa”); }
Параметры шаблонов Параметры шаблона бывают двух видов: 1) class имя — параметр, обозначающий тип; 2) тип имя — параметр, обозначающий константу. Пример. Определение функции, которая возвращает значение порога, если аргумент больше порога. template<class T, T def> T trsh(const T& x) { return x< def ? x : def; } cout<< trsh<int, 5> (10);
Класс - параметр шаблона Если мы хотим применить функцию maximum() к элементам некоторого класса В, он должен допускать сравнение х>y class B { int i; public: B(int v) {i=v; } bool operator > (const B& b) { return i>b. i; } };
Класс - параметр шаблона Другой вариант: класс В должен допускать приведение к типу, который может сравниваться. class B { int i; public: B(int v) { i=v; } operator int() { return i; } };
Перегрузка и специализация шаблонов Шаблоны могут быть перегружены. Специализированная функция шаблона — это обычная функция, имя которой совпадает с именем шаблона. Например, шаблон maximum не годится для строк, поэтому к шаблону добавим: char* maximum(char* a, char* b){ return strcmp(a, b)>0 ? a : b; }
Шаблоны классов Пример. template <class T> class D { T i; public: D(T v) {i=v; } ; operator T() {return i; } }; … cout << maximum <D<int> > (D<int>(5), D <int> (7));
Шаблон для универсального массива Пример. template <class T> class UArr { T *v; int size; public: UArr(int); T& operator[](int i) { return v[i]; } };
Инициализация объектов и специализация шаблонов Определение функции за пределами декларации класса: template <class T> UArr<T>: : Uarr (int n) { v = new T[n]; size = n; } Инициализация объекта класса: UArr<int> x(20); UArr<Myclass> y(30); Специализация шаблона класса: UArr<char*>: : UArr(int n) {. . . } Можно специализировать класс в целом
lk_oop-c_7-11.ppt