Оцените презентацию от 1 до 5 баллов!
Тип файла:
ppt / pptx (powerpoint)
Всего слайдов:
21 слайд
Для класса:
1,2,3,4,5,6,7,8,9,10,11
Размер файла:
197.00 kB
Просмотров:
50
Скачиваний:
0
Автор:
неизвестен
Слайды и текст к этой презентации:
№1 слайд![Обобщённое программирование.](/documents_6/96b028905ae0897903a1678a7a9eb403/img0.jpg)
Содержание слайда: Обобщённое программирование.
Шаблоны
(параметризованные типы)
Обобщённое программирование (generic programming) — парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание.
Обобщённое программирование = параметрический полиморфизм = статический полиморфизм. В C++ поддерживается шаблонами (template).
Полиморфизм подтипов = динамический полиморфизм. В C++ поддерживается наследованием классов.
Специальный полиморфизм (перегрузка функций).
№2 слайд![Повод необходимость](/documents_6/96b028905ae0897903a1678a7a9eb403/img1.jpg)
Содержание слайда: Повод: необходимость реализовать некий новый объем кода, аналогичный уже написанному, но изменив типы данных.
Варианты решения:
Дублирование фрагментов кода (плохо!)
Средствами языка С
Макроопределения. Недостатки:
целесообразно только для очень простых функций;
отсутствует контроль типов;
трудности при отладке;
может сильно увеличить размер исполняемой программы
№3 слайд![. define SP Type struct](/documents_6/96b028905ae0897903a1678a7a9eb403/img2.jpg)
Содержание слайда: 1. #define SP(Type) \
struct Shared_ptr { \
Type *p; \
…
};
SP(LongString); // не будет компилироваться для разных типов,
//т.к. название структуры Shared_ptr будет одинаково для всех типов.
2. #define SP(Type, Name) \
struct Name { \
Type *p; \
…
};
SP(LongString, spLongString); //Код пишется не на языке, а макросом. //Следовательно, компилятор не сможет проверить код.
//Могут возникнуть неожиданные подстановки
Данным решением стоит пользоваться во встраиваемых системах, которые поддерживают только С.
№4 слайд![Обобщённое программирование с](/documents_6/96b028905ae0897903a1678a7a9eb403/img3.jpg)
Содержание слайда: 2) Обобщённое программирование с использованием нетипизированных указателей void* , например, библиотечные функции сортировки qsort(), двоичного поиска bsearch(), копирования памяти memcpy().
void qsort(void *base, size_t num, size_t size, int (*compare) (const void *, const void *));
void * memcpy( void * destptr, const void * srcptr, size_t num );
Недостатки:
отсутствие информации о типах;
требует аккуратной работы с отдельными байтами;
преобразование любых указателей к void* существенно менее наглядно
№5 слайд![Средствами языка С](/documents_6/96b028905ae0897903a1678a7a9eb403/img4.jpg)
Содержание слайда: Средствами языка С++
Переопределение функций. Делает текст программы более наглядным, но не избавляет от необходимости повторять один и тот же алгоритм в нескольких местах.
Шаблоны
Позволяют отделить общий алгоритм от его реализации применительно к конкретным типам данных.
Сочетают преимущества однократной подготовки фрагментов программы (аналогично макрокомандам) и контроль типов, присущий переопределяемым функциям.
№6 слайд![Шаблоны функций Объявление](/documents_6/96b028905ae0897903a1678a7a9eb403/img5.jpg)
Содержание слайда: Шаблоны функций
Объявление шаблона функции начинается с заголовка, состоящего из ключевого слова template, за которым следует список параметров шаблона.
№7 слайд![template lt class T gt T](/documents_6/96b028905ae0897903a1678a7a9eb403/img6.jpg)
Содержание слайда: template <class T>
T toPower (T base, int exponent){
T result = base;
if (exponent==0) return (T)1;
if (exponent<0) return (T)0;
while (--exponent) result *= base;
return result;
}
int i = toPower <int>(10, 3);
int i = toPower (10, 3); // Т становится типом int
long l = toPower (1000L, 4); // Т становится типом long
double d = toPower (1e5, 5); //Т становится типом double
int i = toPower (1000L, 4); // ошибка компиляции:
// используются разные типы данных
№8 слайд![Требования к фактическим](/documents_6/96b028905ae0897903a1678a7a9eb403/img7.jpg)
Содержание слайда: Требования к фактическим параметрам шаблона
T result = base;
return (T)1;
return (T)0;
result *= base;
return result;
№9 слайд![Шаблоны функций с несколькими](/documents_6/96b028905ae0897903a1678a7a9eb403/img8.jpg)
Содержание слайда: Шаблоны функций с несколькими аргументами
// Шаблон функции поиска // в массиве
template <class atype>
int find(atype* array,
atype value, int size) {
for(int j = 0; j < size; j++)
if(array[j] == value)
return j;
return -1;
}
№10 слайд![Отождествление типов](/documents_6/96b028905ae0897903a1678a7a9eb403/img9.jpg)
Содержание слайда: Отождествление типов аргументов
template <class T>
T max (T a, T b)
{
return a > b ? a : b;
}
…
int i = max (1, 2);
double d = max (1.2, 3.4);
// Однако, если аргументы различных типов, то вызов max() приведет к ошибке.
№11 слайд![Шаблоны классов класс,](/documents_6/96b028905ae0897903a1678a7a9eb403/img10.jpg)
Содержание слайда: Шаблоны классов
// класс, хранящий
// пару значений
template <class T>
class Pair
{
T a, b;
public:
Pair (T t1, T t2);
T Max();
T Min ();
int isEqual ();
};
№12 слайд![Полное описание шаблона](/documents_6/96b028905ae0897903a1678a7a9eb403/img11.jpg)
Содержание слайда: Полное описание шаблона должно быть известно до его использования. Нельзя разбить объявление и реализацию на .cpp и .h файлы, реализация должна быть известна и находиться в заголовочном файле.
template <class T>
Pair <T>::Pair (T t1, T t2) : a(t1), b(t2) {}
template <class T>
T Pair <T>::Max()
{return a>b ? a : b;}
template <class T>
int Pair <T>::isEqual(){
if (a==b) return 1;
return 0;}
№13 слайд![Параметризация числовыми](/documents_6/96b028905ae0897903a1678a7a9eb403/img12.jpg)
Содержание слайда: Параметризация числовыми параметрами
Возможность задания числовых параметров позволяет, например, создавать объекты типов "Вектор из 20 целых", "Вектор из 1000 целых" или "Вектор из 10 переменных типа double".
template <class T, int n> class Vector
{
public:
Vector();
~Vector() {delete[] coord;}
void newCoord (T x);
T Max ();
T Min();
int isEqual();
private:
T *coord;
int current;
};
№14 слайд![Шаблонные методы template lt](/documents_6/96b028905ae0897903a1678a7a9eb403/img13.jpg)
Содержание слайда: Шаблонные методы
template <class T>
struct Array{
template<class V>
Array<T>& operator=
(Array<V> const & m);
};
template<class T>
template<class V>
Array<T>& Array<T>::
operator =
(Array const & m) { … }
№15 слайд![Если шаблонная функция или](/documents_6/96b028905ae0897903a1678a7a9eb403/img14.jpg)
Содержание слайда: *Если шаблонная функция (или метод шаблонного класса) не вызывается, то она и не компилируется.
*Виртуальная функция не может быть шаблонной.
Шаблонный конструктор:
template<class T>
struct Array {
template<class V>
Array(Array<V> a) { … }
}; /* предполагается, что есть неявное приведение типа V к T*/
Это не конструктор копирования!
№16 слайд![Специализация шаблона](/documents_6/96b028905ae0897903a1678a7a9eb403/img15.jpg)
Содержание слайда: Специализация шаблона
template <class T>
struct Array { … };
template<>
struct Array<bool>
{
…
//отдельная реализация только для bool
};
№17 слайд![Частичная специализация](/documents_6/96b028905ae0897903a1678a7a9eb403/img16.jpg)
Содержание слайда: Частичная специализация
Массив указателей:
template<class T>
struct Array<T*> { … };
// T- указатель на
какой-либо тип
Массив массивов:
template<class T>
struct Array<Array<T> > { … };
//T - массив Array
№18 слайд![Различия между шаблоном](/documents_6/96b028905ae0897903a1678a7a9eb403/img17.jpg)
Содержание слайда: Различия между шаблоном класса и функциями
Для функций отсутствуют частичные специализации. Но их можно заменить перегрузкой функций:
template<class T>
void sort(Array<T>& m)
{...};
template<class T>
void sort(T& t) {...};
№19 слайд![Typedef Чтобы избежать](/documents_6/96b028905ae0897903a1678a7a9eb403/img18.jpg)
Содержание слайда: Typedef
Чтобы избежать громоздких записей имен типов вида
Array<pair<Array<int>, string> > m;
стоит использовать typedef:
typedef Array<int> AInt;
Array<pair<AInt, string> > m;
typedef int* PI;
typedef const PI CPI; //CPI будет константным указателем, т.к. известно, что PI - указатель. А при использовании #define в CPI было бы const int *, т.е. указатель на const int.
№20 слайд![Наследование в шаблонах](/documents_6/96b028905ae0897903a1678a7a9eb403/img19.jpg)
Содержание слайда: Наследование в шаблонах классов
template <class T>
class Trio: public Pair <T>{
T c;
public:
Trio (T t1, T t2, T t3);
...
};
template <class T>
Trio<T>::Trio (T t1, T t2, T t3): Pair <T> (t1, t2), c(t3) {}
/* вызов родительского конструктора также сопровождается передачей типа Т в качестве параметра*/
№21 слайд![Базовый класс для шаблона](/documents_6/96b028905ae0897903a1678a7a9eb403/img20.jpg)
Содержание слайда: Базовый класс для шаблона может быть как шаблонным, так и обычным классом. Обычный класс может быть порожден от реализованного шаблона.
Нельзя использовать указатель на базовый шаблонный класс для получения доступа к методам производных классов: типы, полученные даже из одного и того же шаблона, всегда являются разными.
В описание шаблона классов можно включать дружественные функции. Если функция-друг не использует спецификатор шаблона, то она считается универсальной для всех экземпляров шаблона. Если же в прототипе функции-друга содержится шаблон параметров, то эта функция будет дружественной только для того класса, экземпляр которого создается.