🗊 Презентация Шаблоны

Категория: Образование
Нажмите для полного просмотра!
Шаблоны, слайд №1 Шаблоны, слайд №2 Шаблоны, слайд №3 Шаблоны, слайд №4 Шаблоны, слайд №5 Шаблоны, слайд №6 Шаблоны, слайд №7 Шаблоны, слайд №8 Шаблоны, слайд №9 Шаблоны, слайд №10 Шаблоны, слайд №11 Шаблоны, слайд №12 Шаблоны, слайд №13 Шаблоны, слайд №14 Шаблоны, слайд №15 Шаблоны, слайд №16 Шаблоны, слайд №17 Шаблоны, слайд №18 Шаблоны, слайд №19 Шаблоны, слайд №20 Шаблоны, слайд №21 Шаблоны, слайд №22 Шаблоны, слайд №23 Шаблоны, слайд №24 Шаблоны, слайд №25 Шаблоны, слайд №26 Шаблоны, слайд №27 Шаблоны, слайд №28 Шаблоны, слайд №29 Шаблоны, слайд №30 Шаблоны, слайд №31 Шаблоны, слайд №32 Шаблоны, слайд №33 Шаблоны, слайд №34 Шаблоны, слайд №35 Шаблоны, слайд №36

Содержание

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

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


Слайд 1


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

Слайд 2


Шаблоны функций – пример потребности #include using namespace std; void print(int *array,int d) { for (int i=0; i < d; cout
Описание слайда:
Шаблоны функций – пример потребности #include using namespace std; void print(int *array,int d) { for (int i=0; i < d; cout

Слайд 3


Применение макросов #include using namespace std; #define PRN(Type,arr,d) \ { for (int i=0; i < d; cout s; }
Описание слайда:
Применение макросов #include using namespace std; #define PRN(Type,arr,d) \ { for (int i=0; i < d; cout s; }

Слайд 4


Шаблоны функций Шаблоны функций являются логическим продолжением механизма перегрузки функций. Обычно перегрузку функций осуществляют для различных...
Описание слайда:
Шаблоны функций Шаблоны функций являются логическим продолжением механизма перегрузки функций. Обычно перегрузку функций осуществляют для различных типов данных, причем все перегруженные функции осуществляют идентичные действия. Например, для сортировки и вывода на экран одномерных массивов данных различных типов, приходится реализовывать различные перегруженные функции, содержимое которых порой отличается только используемыми типами данных. Так для возможности сортировки массивов int* и char* приходится реализовывать две перегруженные функции sort(int*, int) и sort(char*, int). Механизм шаблонов в С++ позволяет решить эту проблему более удобным способом. Достаточно описать один шаблон, а компилятор сгенерирует код такой функции в соответствии использованному типу данных при вызове такой функции.

Слайд 5


Шаблоны функций – определение Шаблон функции задается следующим образом: template возвращаемый_тип имя_функции (аргументы) { . . . } Определение...
Описание слайда:
Шаблоны функций – определение Шаблон функции задается следующим образом: template возвращаемый_тип имя_функции (аргументы) { . . . } Определение каждого типа параметра начинается с ключевого слова class. Если функция использует более одного типа, то все они перечисляются через запятую. При компиляции компилятор вместо типа параметра подставляет необходимый тип, который был задан при вызове функции. В качестве типа параметра могут быть заданы не только встроенные типы, но и типы, определенные пользователем, в том числе и классы.

Слайд 6


Шаблоны функций – определение дополнительно Синтаксис шаблона должен повторяться как при объявлении, так и при определении функции. Помните, шаблоны...
Описание слайда:
Шаблоны функций – определение дополнительно Синтаксис шаблона должен повторяться как при объявлении, так и при определении функции. Помните, шаблоны на самом деле являются макросами, поэтому они должны находиться в файлах .h. Если определение будет находиться в файле .срр, то в других .cpp-файлах нашей программы шаблон будет недоступен и программа работать не будет. // Объявление функции template Type* func(Type* t);

Слайд 7


Шаблоны функций – пример Для нашего примера можем определить: template void print (Array_Type * array, int d) { for (int i=0; i < d; cout s; }
Описание слайда:
Шаблоны функций – пример Для нашего примера можем определить: template void print (Array_Type * array, int d) { for (int i=0; i < d; cout s; }

Слайд 8


Шаблоны функций – еще пример #include using namespace std; class Integer { int n; public: Integer(int n=0) { this->n = n; } int get() { return n; }...
Описание слайда:
Шаблоны функций – еще пример #include using namespace std; class Integer { int n; public: Integer(int n=0) { this->n = n; } int get() { return n; } }; class String { char * str; public: String(char *str="No") { this->str = str; } char * get() { return str; } };

Слайд 9


Шаблоны функций – дополнительно Шаблоны функций могут быть перегружены. Если в шаблоне описаны несколько типов параметров, то они все должны быть...
Описание слайда:
Шаблоны функций – дополнительно Шаблоны функций могут быть перегружены. Если в шаблоне описаны несколько типов параметров, то они все должны быть обязательно описаны в списке аргументов функции. template void print_info (Class_Type1 obj1, Class_Type2 obj2) { cout

Слайд 10


Определение шаблона класса Идея параметризации классов та же – описывается шаблон класса, который осуществляет идентичные действия с различными...
Описание слайда:
Определение шаблона класса Идея параметризации классов та же – описывается шаблон класса, который осуществляет идентичные действия с различными типами данных. Используемый тип данных определяется на стадии компиляции. Объявление параметризированного класса (шаблона): template объявление параметризируемого класса; Тип является аргументом шаблона. Экземпляр параметризированного класса описывается в виде: имя_класса объект; Варианты использования: stack stk_c; // стек на 1000 символов stack stk_str(200); // стек на 200 указателей stack stk_cx(40); // стек на 40 комплексных чисел

Слайд 11


Пример шаблона stack: template class stack { public: explicit stack( int size = 1000) : max_len (size) {s = new TYPE[size]; top = EMPTY; } ~stack( )...
Описание слайда:
Пример шаблона stack: template class stack { public: explicit stack( int size = 1000) : max_len (size) {s = new TYPE[size]; top = EMPTY; } ~stack( ) { delete [ ] s; } void reset( ) { top = EMPTY; } // очистить стек void push(TYPE c) { s[++top] = c; } // записать в стек TYPE pop( ) { return s[top - -]; } // извлечь элемент TYPE top_of ( ) { returns[top]; } // считать элемент bool empty( ) { return (top == EMPTY); } // пуст? bool full( ) { return (top == max_len-1); } // полон? private: enum {EMPTY = -1}; // перечислимый тип данных TYPE* s; // тело стека int max_len; // максимальный размер int top; // вершина стека };

Слайд 12


Пример шаблона «Узел списка»: template class ListNode { private: ListNode* next; Type* data; public: ListNode(Type* d, ListNode* n = NULL) : next(n),...
Описание слайда:
Пример шаблона «Узел списка»: template class ListNode { private: ListNode* next; Type* data; public: ListNode(Type* d, ListNode* n = NULL) : next(n), data(d) {} ~ListNode() { delete next; } Type* Data() { return data; } ListNode* Next() { return next; } }; . . . ListNode list = new ListNode (new Obj); Obj* f = list->Data(); // Возвращает правильный тип

Слайд 13


Параметризованные функции классов -1 template class ListNode { private: ListNode next; Type* data; public: ListNode(Type* d, ListNode* n = NULL);...
Описание слайда:
Параметризованные функции классов -1 template class ListNode { private: ListNode next; Type* data; public: ListNode(Type* d, ListNode* n = NULL); ~ListNode(); Type* Data(); ListNode* Next(); }; // Все тоже самое, только функции лишь объявлены, но не определены

Слайд 14


Параметризованные функции классов -2 template ListNode::ListNode(Type* d, ListNode* n = NULL) : next(n), data(d) { } template ListNode::~ListNode() {...
Описание слайда:
Параметризованные функции классов -2 template ListNode::ListNode(Type* d, ListNode* n = NULL) : next(n), data(d) { } template ListNode::~ListNode() { delete next; } template Type* ListNode::Data() { return data; } template ListNode* ListNode::Next() { return next; } Помните: все это должно находиться в файле .h. Исключение составляют ситуации, когда функции класса вызываются только из того же файла, в котором определяются. В этом случае определения функций класса должны предшествовать их первому использованию.

Слайд 15


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

Слайд 16


Явная инициализация базовых типов При явном вызове конструктора без аргументов базовые типы инициализируются нулями. int i1; // Неопределенное...
Описание слайда:
Явная инициализация базовых типов При явном вызове конструктора без аргументов базовые типы инициализируются нулями. int i1; // Неопределенное значение int i2 = int(); // Переменная инициализируется нулем Такая возможность была реализована для того, чтобы было можно написать код шаблона, в котором величине любого типа заведомо будет присвоено некоторое значение по умолчанию. Например, в следующей функции вызов конструктора гарантирует, что для всех базовых типов переменная x будет инициализирована нулем:

Слайд 17


Передача параметра Многочисленные символы < и > вызывают изрядную путаницу, поскольку C++ не всегда последователен. следует указывать везде, кроме...
Описание слайда:
Передача параметра Многочисленные символы < и > вызывают изрядную путаницу, поскольку C++ не всегда последователен. следует указывать везде, кроме трех мест в объявлениях классов или определениях их функций: 1. За ключевым словом class в самом начале. 2. При указании имени конструктора. 3. При указании имени деструктора. Аргументы конструкторов и деструкторов должны быть параметризо-ванными, как и все использования имени класса за исключением трех указанных случаев. При любом использовании параметризованного типа или функции необходимо указывать параметр. В трех указанных ситуациях компилятор может сделать разумные предположения по поводу отсутствующих символов.

Слайд 18


Где не надо ? template class ListNode { private: ListNode next; Type* data; public: ListNode(Type* d, ListNode* n = NULL); ~ListNode(); Type* Data();...
Описание слайда:
Где не надо ? template class ListNode { private: ListNode next; Type* data; public: ListNode(Type* d, ListNode* n = NULL); ~ListNode(); Type* Data(); ListNode* Next(); };

Слайд 19


А если несколько параметров? «Тип может иметь более одного параметра, хотя такие ситуации встречаются довольно редко. Увидев такой класс, я обычно...
Описание слайда:
А если несколько параметров? «Тип может иметь более одного параметра, хотя такие ситуации встречаются довольно редко. Увидев такой класс, я обычно затеваю с автором долгую беседу о принципах построения программ. Тем не менее, иногда использование многоаргументных шаблонов бывает оправданным. Синтаксис выглядит аналогично, разве что вместо используется список типа . Наконец, параметр не обязан быть классом. Он может быть структурой или еще чем-нибудь, хотя именно классы прочно удерживают ведущие позиции на рынке параметров. » (из книги Джефф Элджер. С++. Библиотека программиста)

Слайд 20


Шаблоны классов со статическими членами template class clt { static int Nobj; Type element; public: clt (Type e) { element = e; }; Type& get(){...
Описание слайда:
Шаблоны классов со статическими членами template class clt { static int Nobj; Type element; public: clt (Type e) { element = e; }; Type& get(){ return element; } friend ostream& operator

Слайд 21


Шаблоны классов со статическими членами int clt::Nobj = 0; int clt::Nobj = 0; int clt::Nobj = 0; void main() { clt Num(5); clt...
Описание слайда:
Шаблоны классов со статическими членами int clt::Nobj = 0; int clt::Nobj = 0; int clt::Nobj = 0; void main() { clt Num(5); clt Str("Message"); clt dbl(5.9); cout

Слайд 22


Наследование Параметризованные классы могут быть производными от других классов, параметризованных или нет. Параметризованный класс может выступать в...
Описание слайда:
Наследование Параметризованные классы могут быть производными от других классов, параметризованных или нет. Параметризованный класс может выступать в качестве базового; в этом случае производный класс также будет параметризованным с тем же форматом аргументов, что и в базовом классе. В производном классе могут добавляться новые параметры, но разбираться в полученной куче вам надоест уже с третьей строки… Чаще всего встречается наследование параметризованного типа от непараметризованного.

Слайд 23


Комбинации простых и параметризованных типов Рассмотрим 3 ситуации: 1) Предположим, у вас имеется параметризованный класс, реализация всех функций...
Описание слайда:
Комбинации простых и параметризованных типов Рассмотрим 3 ситуации: 1) Предположим, у вас имеется параметризованный класс, реализация всех функций которого занимает 1000 строк. При каждом его использовании для нового типа компилятор радостно выплевывает очередные 1000 строк расширенного кода. Это слишком высокая цена за безопасность типа. 2) Допустим, вы продаете библиотеку классов и не хотите поставлять исходный текст, а только интерфейсы. Если библиотека содержит параметризованные функции, они должны находиться в открытом для всего мира файле .h. Обидно. 3) Допустим, кто-то передает вам замечательный, но небезопасный по отношению к типам класс или библиотеку классов. Может быть, он был написан на компиляторе, который не поддерживает шаблоны, или автор просто не верит в шаблоны. Вам хочется подправить код и сделать его безопасным с помощью шаблонов. Но хотите ли вы переделывать все подряд, включать весь код реализации в файлы .h и добавлять в объявления класса параметры и символы ?

Слайд 24


Комбинации простых и параметризованных типов Во всех описанных ситуациях стоит использовать параметризованный тип в сочетании с простым,...
Описание слайда:
Комбинации простых и параметризованных типов Во всех описанных ситуациях стоит использовать параметризованный тип в сочетании с простым, непараметризованным типом. Когда это будет сделано, в 99 случаях из 100 параметризованный тип «заворачивает» простой тип в симпатичную, мягкую и безопасную по отношению к типам оболочку. При этом простой класс не изменяется — просто параметризованный класс помещается между небезопасным классом и пользователем.

Слайд 25


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

Слайд 26


Небезопасные типы в закрытых базовых классах Самый простой способ обеспечить безопасность типов — сделать ненадежный класс закрытым базовым классом...
Описание слайда:
Небезопасные типы в закрытых базовых классах Самый простой способ обеспечить безопасность типов — сделать ненадежный класс закрытым базовым классом безопасного шаблона.

Слайд 27


Ключевое слово typename Ключевое слово typename означает, что следующий за ним идентификатор обозначает тип. Рассмотрим пример:
Описание слайда:
Ключевое слово typename Ключевое слово typename означает, что следующий за ним идентификатор обозначает тип. Рассмотрим пример:

Слайд 28


Еще о typename В рассмотренном примере переменная ptr является указателем на int. В общем случае подтип может быть абстрактным типом данных (например...
Описание слайда:
Еще о typename В рассмотренном примере переменная ptr является указателем на int. В общем случае подтип может быть абстрактным типом данных (например классом). В этом случае: class Q { class SubType; . . . }; Ключевое слово typename всегда должно квалифицировать идентификатор шаблона как тип, даже если другая интерпретация не имеет смысла. В С++ любой идентификатор шаблона, указанный без ключевого слова typename, интерпретируется как значение. Ключевое слово typename также может использоваться вместо слова class в определении шаблона: template class clt { . . . };

Слайд 29


Нетипизированные параметры шаблонов В качестве параметров шаблонов могут выступать не только типы. Однако такой нетипизированный параметр все равно...
Описание слайда:
Нетипизированные параметры шаблонов В качестве параметров шаблонов могут выступать не только типы. Однако такой нетипизированный параметр все равно считается частью определения типа. Так например, аргумент шаблона стандартного класса bitset содержит количество входящих в него бит. bitset field32; // поле на 32 бита bitset field50; // поле на 50 бит Эти поля будут относится к разным типам, поскольку при их определении задаются разные значения аргументов шаблона. Следовательно, их нельзя присваивать или сравнивать друг с другом (при отсутствии соответствующего преобразования типа).

Слайд 30


Параметры шаблонов по умолчанию Шаблоны классов могут иметь параметры по умолчанию. Следующий пример разрешает объявлять объекты класса MyClass как с...
Описание слайда:
Параметры шаблонов по умолчанию Шаблоны классов могут иметь параметры по умолчанию. Следующий пример разрешает объявлять объекты класса MyClass как с одним, так и с двумя аргументами. template class MyClass . . . При передаче одного аргумента вместо второго используется параметр по умолчанию: MyClass x1; // Эквивалентно: MyClass x1; Аргументы шаблонов по умолчанию могут определяться на основе предыдущих аргументов.

Слайд 31


Тесты … Вопрос: Что выведет следующая программа:
Описание слайда:
Тесты … Вопрос: Что выведет следующая программа:

Слайд 32


Тесты … Вопрос: Что выведет следующая программа:
Описание слайда:
Тесты … Вопрос: Что выведет следующая программа:

Слайд 33


Тесты … Вопрос: Что выведет следующая программа:
Описание слайда:
Тесты … Вопрос: Что выведет следующая программа:

Слайд 34


Тесты … Вопрос: Что выведет следующая программа:
Описание слайда:
Тесты … Вопрос: Что выведет следующая программа:

Слайд 35


Тесты … Вопрос: Что выведет следующая программа:
Описание слайда:
Тесты … Вопрос: Что выведет следующая программа:

Слайд 36


Тесты … Вопрос: Что выведет следующая программа:
Описание слайда:
Тесты … Вопрос: Что выведет следующая программа:



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