🗊Презентация ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы)

Нажмите для полного просмотра!
ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №1ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №2ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №3ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №4ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №5ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №6ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №7ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №8ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №9ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №10ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №11ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №12ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №13ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №14ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №15ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №16ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №17ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №18ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №19ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №20ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы), слайд №21

Содержание

Вы можете ознакомиться и скачать презентацию на тему ООП 6. Обобщённое программирование. Шаблоны (параметризованные типы). Доклад-сообщение содержит 21 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Обобщённое программирование.
Шаблоны 
(параметризованные типы)

Обобщённое программирование (generic programming) — парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание. 
Обобщённое программирование = параметрический полиморфизм = статический полиморфизм. В C++  поддерживается шаблонами (template). 
Полиморфизм подтипов = динамический полиморфизм. В C++ поддерживается наследованием классов.
Специальный полиморфизм (перегрузка функций).
Описание слайда:
Обобщённое программирование. Шаблоны (параметризованные типы) Обобщённое программирование (generic programming) — парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание. Обобщённое программирование = параметрический полиморфизм = статический полиморфизм. В C++ поддерживается шаблонами (template). Полиморфизм подтипов = динамический полиморфизм. В C++ поддерживается наследованием классов. Специальный полиморфизм (перегрузка функций).

Слайд 2





 
Повод: необходимость реализовать некий новый объем кода, аналогичный уже написанному, но изменив типы данных.
Варианты решения: 
Дублирование фрагментов кода (плохо!)
Средствами языка С
Макроопределения. Недостатки: 
целесообразно только для очень простых функций; 
отсутствует контроль типов; 
трудности при отладке;
может сильно увеличить размер исполняемой программы
Описание слайда:
Повод: необходимость реализовать некий новый объем кода, аналогичный уже написанному, но изменив типы данных. Варианты решения: Дублирование фрагментов кода (плохо!) Средствами языка С Макроопределения. Недостатки: целесообразно только для очень простых функций; отсутствует контроль типов; трудности при отладке; может сильно увеличить размер исполняемой программы

Слайд 3





 
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);  //Код пишется не на языке, а макросом. 	//Следовательно, компилятор не сможет проверить код.  
		//Могут возникнуть неожиданные подстановки
Данным решением стоит пользоваться во встраиваемых системах, которые поддерживают только С.
Описание слайда:
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





 
	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* существенно менее наглядно
Описание слайда:
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





 
Средствами языка С++
Переопределение функций.  Делает текст программы более наглядным, но не избавляет от необходимости повторять один и тот же алгоритм в нескольких местах. 
Шаблоны
Позволяют отделить общий алгоритм от его реализации применительно к конкретным типам данных.
Сочетают преимущества однократной подготовки фрагментов программы (аналогично макрокомандам) и контроль типов, присущий переопределяемым функциям.
Описание слайда:
Средствами языка С++ Переопределение функций. Делает текст программы более наглядным, но не избавляет от необходимости повторять один и тот же алгоритм в нескольких местах. Шаблоны Позволяют отделить общий алгоритм от его реализации применительно к конкретным типам данных. Сочетают преимущества однократной подготовки фрагментов программы (аналогично макрокомандам) и контроль типов, присущий переопределяемым функциям.

Слайд 6





Шаблоны функций

Объявление шаблона функции начинается с заголовка, состоящего из ключевого слова template, за которым следует список параметров шаблона.
Описание слайда:
Шаблоны функций Объявление шаблона функции начинается с заголовка, состоящего из ключевого слова template, за которым следует список параметров шаблона.

Слайд 7





 
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);  // ошибка компиляции:
			// используются разные типы данных
Описание слайда:
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





Требования к фактическим параметрам шаблона
T result = base;
return (T)1;
return (T)0;
result *= base;
return result;
Описание слайда:
Требования к фактическим параметрам шаблона T result = base; return (T)1; return (T)0; result *= base; return result;

Слайд 9





Шаблоны функций с несколькими аргументами 
// Шаблон функции поиска // в массиве 
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; 
}
Описание слайда:
Шаблоны функций с несколькими аргументами // Шаблон функции поиска // в массиве 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





Отождествление типов аргументов

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() приведет к ошибке.
Описание слайда:
Отождествление типов аргументов 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





Шаблоны классов

// класс, хранящий 
// пару значений
template <class T>
class Pair
{
    T a, b;
 public:
    Pair (T t1, T t2);
    T Max();
    T Min ();
    int isEqual ();
};
Описание слайда:
Шаблоны классов // класс, хранящий // пару значений template <class T> class Pair {    T a, b;  public:    Pair (T t1, T t2);    T Max();    T Min ();    int isEqual (); };

Слайд 12





Полное описание шаблона должно быть известно до его использования. Нельзя разбить объявление и реализацию на .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;}
Описание слайда:
Полное описание шаблона должно быть известно до его использования. Нельзя разбить объявление и реализацию на .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





Параметризация числовыми параметрами
Возможность задания числовых параметров позволяет, например, создавать объекты типов "Вектор из 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;
};
Описание слайда:
Параметризация числовыми параметрами Возможность задания числовых параметров позволяет, например, создавать объекты типов "Вектор из 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 <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) { … }
Описание слайда:
Шаблонные методы 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






*Если шаблонная функция (или метод шаблонного класса) не вызывается, то она и не компилируется.
*Виртуальная функция не может быть шаблонной.

Шаблонный конструктор:
template<class T>
struct Array { 
    template<class V>
   Array(Array<V> a) { … }
}; /* предполагается, что есть неявное приведение типа V к T*/
Это не конструктор копирования!
Описание слайда:
*Если шаблонная функция (или метод шаблонного класса) не вызывается, то она и не компилируется. *Виртуальная функция не может быть шаблонной. Шаблонный конструктор: template<class T> struct Array {   template<class V>    Array(Array<V> a) { … } }; /* предполагается, что есть неявное приведение типа V к T*/ Это не конструктор копирования!

Слайд 16





Специализация шаблона

template <class T>
struct Array { … };
 
template<>
struct Array<bool>
{
…
 //отдельная реализация 	только для bool
};
Описание слайда:
Специализация шаблона template <class T> struct Array { … };   template<> struct Array<bool> { …  //отдельная реализация только для bool };

Слайд 17





Частичная специализация


Массив указателей:
template<class T>
struct Array<T*> { … };
// T- указатель на 
какой-либо тип
Массив массивов:
template<class T>
struct Array<Array<T> > { … };
//T - массив Array
Описание слайда:
Частичная специализация Массив указателей: template<class T> struct Array<T*> { … }; // T- указатель на какой-либо тип Массив массивов: template<class T> struct Array<Array<T> > { … }; //T - массив Array

Слайд 18





Различия между шаблоном класса и функциями 


Для функций отсутствуют частичные специализации. Но их можно заменить перегрузкой функций:
template<class T>
void sort(Array<T>& m)
 {...};
 
template<class T>
void sort(T& t) {...};
Описание слайда:
Различия между шаблоном класса и функциями Для функций отсутствуют частичные специализации. Но их можно заменить перегрузкой функций: template<class T> void sort(Array<T>& m)  {...};   template<class T> void sort(T& t) {...};

Слайд 19





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.
Описание слайда:
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





Наследование в шаблонах классов

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) {} 
/* вызов родительского конструктора также сопровождается передачей типа Т в качестве параметра*/
Описание слайда:
Наследование в шаблонах классов 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





 
Базовый класс для шаблона может быть как шаблонным, так и обычным классом. Обычный класс может быть порожден от реализованного шаблона.
Нельзя использовать указатель на базовый шаблонный класс для получения доступа к методам производных классов: типы, полученные даже из одного и того же шаблона, всегда являются разными.
В описание шаблона классов можно включать дружественные функции. Если функция-друг не использует спецификатор шаблона, то она считается универсальной для всех экземпляров шаблона. Если же в прототипе функции-друга содержится шаблон параметров, то эта функция будет дружественной только для того класса, экземпляр которого создается.
Описание слайда:
Базовый класс для шаблона может быть как шаблонным, так и обычным классом. Обычный класс может быть порожден от реализованного шаблона. Нельзя использовать указатель на базовый шаблонный класс для получения доступа к методам производных классов: типы, полученные даже из одного и того же шаблона, всегда являются разными. В описание шаблона классов можно включать дружественные функции. Если функция-друг не использует спецификатор шаблона, то она считается универсальной для всех экземпляров шаблона. Если же в прототипе функции-друга содержится шаблон параметров, то эта функция будет дружественной только для того класса, экземпляр которого создается.



Похожие презентации
Mypresentation.ru
Загрузить презентацию