Шаблоны 1. Механизм шаблонов реализует в С++ параметрический полиморфизм. 2. Шаблон представляет собой предварительное описание функции или класса, конкретное.

Презентация:



Advertisements
Похожие презентации
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Advertisements

Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
Функции Функция – именованная последовательность описаний и операторов, выполняющая некоторое действие. Может иметь параметры и возвращать значение. Функция.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Инструкции C++ Условная инструкция Формат: if (условие) оператор; else оператор; Пример: if (i!=0) { if (j) j++; if(k) k++; else if(p) k--; } else i--;
Лекция 21. Шаблоны (часть 1) Красс Александр СПбГУ ИТМО, 2008.
Прикладное программирование кафедра прикладной и компьютерной оптики Полиморфизм.
Лекция 6 Функции. Объявления и определения Объявление функции – указание имени функции, а также входных и выходных параметров Определение функции – указание.
Лекция 6 Функции. Объявления и определения Объявление функции – указание имени функции, а также входных и выходных параметров Определение функции – указание.
Множественное наследование class A {... }; class B {... }; class C : public A, protected B {... }; !!! Спецификатор доступа распространяется только на.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Полиморфизм Полиморфизм (polymorphism) - последний из трех "китов", на которых держится объектно-ориентированное программирование Слово это можно перевести.
Обработка исключений Основы метапрограммированияОбработка исключений Основы метапрограммирования.
Лекция 22. Шаблоны (часть 2) Красс Александр СПбГУ ИТМО, 2008.
Полиморфизм. Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Статические поля класса Статические поля хранят данные, общие для всех элементов класса. Статическое поле существует в единственном экземпляре для всех.
©Павловская Т.А. Язык С++ Курс «С++. Программирование на языке высокого уровня» Павловская Т.А.
Лекция 10 ОбъектыЛекция 10 ОбъектыООП Инкапсуляция Возможность совместного хранения данных и кода для их обработки Наследование Возможность расширять существующие.
Объектно-ориентированный подход в языке C#. Класс в языке C# - ссылочный тип, определенный пользователем. Для классов ЯП C# допустимо только единичное.
Конструкторы и Деструкторы Конструкторы - функции, явно предназначенные для инициализации объектов Деструкторы - функция обратная конструктору для обеспечения.
Транксрипт:

Шаблоны 1. Механизм шаблонов реализует в С++ параметрический полиморфизм. 2. Шаблон представляет собой предварительное описание функции или класса, конкретное представление которых зависит от параметров шаблона. 3. Для описания шаблонов используется ключевое слово template, вслед за которым указываются аргументы (параметры шаблона), заключенные в угловые скобки. 4. Параметры шаблона перечисляются через запятую, и могут быть: а) объектами следующих типов: - целочисленного, - перечислимого, - указательного (в том числе указатели на члены класса), - ссылочного; б) именами типов (перед именем типа надо указывать ключевое слово class или typename). 5. Параметры-объекты являются константами, их нельзя изменять внутри шаблона.

Шаблоны функций. template тип_рез-та имя_функции ( список_аргументов_функции ) { /*...*/ } Обращение к функции-шаблону: имя_функции (список_фактич_аргументов_функции ); Пример:template // функция суммирования элементов массива T sum ( T array[ ], int size ) { T res = 0; for ( int i = 0; i < size; i++ ) res += array[ i ]; return res; } Использование шаблона для массивов типа int [10] : int iarray [10]; int i_sum; //... i_sum = sum ( iarray, 10 ); Можно задать аргумент size в виде параметра шаблона: template T sum ( T array [ ] ) { /*... */ } Тогда вызов sum будет таким: i_sum = sum ( iarray );

Неявное определение параметра-типа шаблона Пример 1.class complex {... public: complex ( double r = 0, double i = 0 ); operator double (); }; template T f ( T& x, T& y ) { return x > y ? x : y; } double f ( double x, double y ){ return x > y ? -x : -y; } int main ( ) { complex a ( 2, 5 ), b ( 2, 7 ), c; double x = 3.5, y = 1.1; int i, j = 8, k = 10; c = f ( a, b );// f (a, b) x = f ( a, y ); // f (a, y) i = f ( j, k ); // f (j, k) return 0; }

Пример 2. template T max (T & x, T & y) { return x > y ? x : y; } int main ( ) { double x = 1.5, y = 2.8, z; int i = 5, j = 12, k; char * s1 = "abft"; char * s2 = "abxde", * s3; z = max ( x, y ); // max k = max (i, j); // max //z = max (x, i); // Err! - неоднозначный выбор параметров z = max ( y, j ); s3 = max (s2, s1);// max, // но происходит сравнение адресов return 0; }

Пример 3. template T m1 (T a, T b) {int m1 (int a, int b) { cout

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

Шаблоны классов. Шаблоны создаются для классов, имеющих общую логику работы. Для определения шаблона класса перед ключевым словом class помещается template-квалификатор. template class имя_класса { /*...*/ }; Конкретный экземпляр шаблона класса (объект класса) можно создать так: имя_класса объект; Для шаблонов класса никакие фактические параметры по умолчанию не выводятся. Функции-члены класса-шаблона автоматически становятся функциями- шаблонами. Шаблоны методов. Можно описывать шаблонные методы в классах, не являющихся шаблонами. Запрещено определять шаблонны для виртуальных методов, из-за возникающих больших накладных расходов на возможную перестройку таблиц виртуальных методов при компиляции.

template Шаблонный класс stack. class stack { T s [max_size]; int top; public: stack ( ) { top = 0;} void reset ( ) { top = 0;} void push (T i); T pop (); bool is_empty ( ) { return top == 0;} bool is_full () { return top == max_size;} };template void stack :: push (T i) { T stack :: pop ( ) { if ( ! is_full () ) { if ( ! is_empty () ) { s [top] = i; top --; top ++; return s [top];}else throw "stack_is_full"; throw "stack_is_empty";}

Виды отношений между классами Часто при проектировании программ, разрабатываемых в объектно- ориентированном стиле, взаимосвязь используемых в них классов и объектов представляют в виде диаграмм UML. Классы изображают в виде прямоугольника, состоящего из трех частей: сверху – имя класса, в середине – члены данные, возможно, с указанием типов, внизу – прототипы методов класса. Имена абстрактных классов и чистых виртуальных функций выделяются курсивом. Перед описанием имени члена класса или метода можно указать спецификатор доступа с помощью значков + (public), - (private) или # (protected). Для статических членов класса после спецификатора доступа указывается символ $. Большинство ООЯП поддерживают следующие отношения между классами: Ассоциация. Наследование. Агрегация. Использование. Инстанцирование.

Ассоциация Ассоциация – отношение, показывающее, что два класса концептуально взаимодействуют друг с другом. Отношение ассоциации удобно представлять в виде ER- диаграмм (entity – relationships – сущность - связь), в основном используемым при разработке реляционных баз данных. Связи изображаются сплошными линиями без направления. Виды связей, представляемых ER-диаграммами: 11 1N NN Различают обязательное и необязательное участие сущностей в установленных между ними связях. Примеры: покупатель 0...N N товары многоугольник N вершина

Наследование Часть – общее ( is a ). Отношение задается в виде стрелки с незакрашенным треугольником на конце, которая указывает на базовый класс. Пример: животное < кошка базовый класспроизводный класс суперклассподкласс

Агрегация. Часть – целое ( has a ). Строгую агрегацию – композиция. Нестрогая агрегация - агрегацию (при этом один объект может быть включен в разные объекты одновременно). Композиция обозначается стрелкой с закрашенным ромбом на конце, направленной на включающий класс, а агрегация – стрелкой с незакрашенным ромбом на конце. Примеры: треугольник 3 точка. class triangle {... point p1,p2,p3;... } магазин 0...N товар. class shop {... goods * g;... }

Использование и Инстанцирование Отношение использования возникает, когда в прототипе метода одного класса используется имя другого класса; в теле метода одного класса - локальный объект другого класса; в теле метода одного класса вызывается функция другого класса. Использующий класс называют client, а используемый supplier. Отношение использования обозначается пунктирной стрелкой указывающей на класс supplier. Пример: треугольник > точка +move (точка p1,... ) Инстанцирование – связь между шаблоном класса и классом - результатом генерации по шаблону. В UML инстанцирование обозначается стрелкой, идущей от шаблона класса к конкретной его реализации.