- •Список литературы по модулю
- •История языка C++
- •Основные особенности C++
- •Простые расширения языка C
- •Объявление переменных ссылочного типа
- •Инициализация и использование ссылок
- •Ссылки в формальных параметрах функций
- •Ссылки как возвращаемые значения функций
- •Константные ссылки
- •Объявление класса
- •Секции в объявлении класса
- •Пример: секции в объявлении класса
- •Объявление полей
- •Определения статических полей
- •Объявление методов
- •Виртуальные и абстрактные методы
- •Объявление конструкторов
- •Пример: объявление конструкторов
- •Создание объектов в динамической памяти
- •Создание массивов в динамической памяти
- •Удаление объектов и массивов
- •Объявление деструктора
- •Пример: объявление деструктора
- •Объекты в автоматической памяти
- •Пример: автоматический вызов деструктора
- •Пример: автоматический вызов деструктора (продолжение)
- •Объекты в глобальной памяти
- •Объекты в полях других объектов
- •Пример: объекты в полях других объектов
- •Проблема копирования объектов
- •Объявление конструктора копий
- •Перегруженная операция присваивания
- •Основной способ наследования в C++
- •Пример: одиночное наследование
- •Переопределение методов
- •Пример: переопределение методов
- •Динамическое приведение типов
- •Пример: динамическое приведение типов не всегда допустимо
- •Пример: динамическое приведение типов
- •private- и protected-наследование
- •Наследование от нескольких базовых классов
- •Иерархия наследования и классы противоречия
- •Неоднозначности в противоречивых иерархиях
- •Разрешение неоднозначностей
- •Основная проблема противоречивых иерархий
- •Виртуальное наследование
- •Пример: виртуальное наследование
- •Понятие шаблона
- •Типовые формальные параметры шаблона
- •Нетиповые формальные параметры шаблона
- •Шаблонные формальные параметры шаблона
- •Значения параметров шаблона по умолчанию
- •Зависимые идентификаторы в шаблоне
- •Инстанциация шаблонов
- •Выведение фактических параметров при инстанциации шаблона функции
- •Требования к фактическим параметрам шаблонов
- •Специализация шаблона функции
- •Пример: специализация шаблона функции
- •Пример: перегрузка имеет больший приоритет, чем специализация
- •Cпециализация шаблона класса
- •Пример: специализация шаблона класса
- •Частичная специализация шаблона класса
- •Вычисления во время компиляции
- •Пример: возведение числа в степень
- •Понятие перегрузки операций
- •Ассортимент перегружаемых операций
- •Перегрузка операции присваивания
- •Операция присваивания возвращает левое значение
- •Составные операции присваивания
- •Перегрузка бинарных арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операций с помощью функций
- •Перегрузка унарных операций
- •Перегрузка операции приведения типа
- •Исключения
- •Оператор throw
- •Пример: оператор throw
- •Синтаксис try- и catch-блоков
- •Пример: перехват исключения std::bad_alloc
- •Жизненный цикл объектов-исключений
- •Пример 1: жизненный цикл объектов-исключений
- •Пример 2: жизненный цикл объектов-исключений
- •Пример 3: жизненный цикл объектов-исключений
- •Пример: уничтожение автоматических объектов в процессе передачи исключения в catch-блок
- •Перехват исключений в инициализаторах конструкторов
- •Пример: перехват исключений в инициализаторах конструкторов
- •Спецификатор throw в заголовках функций
- •Пример 1: спецификатор throw
- •Пример 2: спецификатор throw
- •Спецификатор throw и переопределение виртуальных методов
- •Создание классов исключений
- •Пример: создание классов исключений
Требования к фактическим параметрам шаблонов
Базовые
сведения
Обобщённое программирова- ние
Объявление шаблонов Порождение кода
Специализация
шаблонов
Перегрузка
операций
Исключения
Тело шаблона накладывает требования на его фактические параметры. Например, в теле шаблона функции multiply подразумевается, что значения типа M – это объекты, имеющие метод at, который возвращает ссылку на значение, к которому могут быть применены операции сложения и умножения.
Если фактические параметры шаблона не удовлетворяют требованиям, инстанциация шаблона с этими фактическими параметрами приведёт к ошибке времени компиляции. Например,
template < typename T , int M , int N >
struct Array2D { |
T |
a[M ][ N ]; }; |
... |
|
|
Array2D <int ,3 ,1 > |
x; |
|
Array2D <int ,1 ,3 > |
y; |
|
Array2D <int ,3 ,3 > |
z; |
|
multiply (z ,x ,y ); |
// |
error : struct Array2D < int , 3, 3> |
|
// |
has no member named ’at ’ |
|
|
58 / 99 |
Специализация шаблона функции
Базовые
сведения
Обобщённое программирова- ние
Объявление шаблонов Порождение кода
Специализация
шаблонов
Перегрузка
операций
Исключения
Специализация шаблона – это разработка отдельной версии порождаемого шаблоном кода для конкретного набора фактических параметров.
Пусть имеется шаблон функции вида
template < формальные_параметры > тип имя (...)
{ ... }
Специализированная версия функции для конкретного набора фактических параметров записывается как
template <> |
|
тип имя < фактические_параметры >(... |
) |
{ ... } |
|
Следует иметь в виду, что специализация шаблона функции не даёт особенных преимуществ над обычной перегрузкой функций.
59 / 99
Пример: специализация шаблона функции
Базовые |
1 |
|
сведения |
2 |
|
|
||
Обобщённое |
3 |
|
программирова- |
||
|
||
ние |
4 |
|
Объявление |
5 |
|
шаблонов |
||
|
||
Порождение |
6 |
|
кода |
7 |
|
Специализация |
||
8 |
||
шаблонов |
||
|
||
Перегрузка |
9 |
|
|
||
операций |
10 |
|
Исключения |
11 |
|
|
12 |
|
|
13 |
|
|
14 |
|
|
15 |
|
|
16 |
|
|
17 |
|
|
18 |
|
|
19 |
|
|
20 |
|
|
21 |
template < typename T > void do_swap (T& a , T& b)
{
T c = a;
a= b;
b= c;
}
template <> void do_swap <int >( int & a , int & b)
{
a+= b;
b= a -b;
a= a -b;
}
int main () |
|
|
{ |
|
|
int x = 10 , y |
= 20; |
|
do_swap (x , y ); |
// |
будет вызвана функция |
|
// |
в строчках 8..13 |
return 0; |
|
|
} |
|
|
60 / 99
Пример: перегрузка имеет больший приоритет, чем специализация
Базовые |
1 |
|
|
||
сведения |
2 |
|
Обобщённое |
3 |
|
|
||
программирова- |
4 |
|
ние |
||
5 |
||
Объявление |
||
|
||
шаблонов |
6 |
|
Порождение |
7 |
|
кода |
||
|
||
Специализация |
8 |
|
шаблонов |
9 |
|
|
||
Перегрузка |
10 |
|
операций |
||
|
||
|
11 |
|
Исключения |
12 |
|
|
||
|
13 |
|
|
14 |
|
|
15 |
|
|
16 |
|
|
17 |
|
|
18 |
|
|
19 |
|
|
20 |
|
|
21 |
|
|
22 |
template < typename T > T t_max (T a , T b)
{
|
cout |
<< |
"1 "; |
return |
a |
> |
b |
? |
a |
: b; |
} |
|
|
|
|
|
|
|
|
|
|
template |
<> |
|
|
|
|
|
|
|
|
|
int |
t_max <int >( int |
a , int |
b) |
|
|
|
|
|||
{ |
|
|
|
|
|
|
|
|
|
|
|
cout |
<< |
"2 "; |
return |
a |
> |
b |
? |
a |
: b; |
} |
|
|
|
|
|
|
|
|
|
|
int t_max ( int a , int b) { |
|
|
|
|
|
|
||||
|
cout |
<< |
"3 "; |
return |
a |
> |
b |
? |
a |
: b; |
} |
|
|
|
|
|
|
|
|
|
|
int |
main () |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
int x = 10 , y = 20; |
|
|
|
|
|
|
|||
|
cout |
<< |
t_max (x ,y ); // |
|
Вывод : |
3 |
20 |
|||
|
return |
0; |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
61 / 99 |