- •Список литературы по модулю
- •История языка C++
- •Основные особенности C++
- •Простые расширения языка C
- •Объявление переменных ссылочного типа
- •Инициализация и использование ссылок
- •Ссылки в формальных параметрах функций
- •Ссылки как возвращаемые значения функций
- •Константные ссылки
- •Объявление класса
- •Секции в объявлении класса
- •Пример: секции в объявлении класса
- •Объявление полей
- •Определения статических полей
- •Объявление методов
- •Виртуальные и абстрактные методы
- •Объявление конструкторов
- •Пример: объявление конструкторов
- •Создание объектов в динамической памяти
- •Создание массивов в динамической памяти
- •Удаление объектов и массивов
- •Объявление деструктора
- •Пример: объявление деструктора
- •Объекты в автоматической памяти
- •Пример: автоматический вызов деструктора
- •Пример: автоматический вызов деструктора (продолжение)
- •Объекты в глобальной памяти
- •Объекты в полях других объектов
- •Пример: объекты в полях других объектов
- •Проблема копирования объектов
- •Объявление конструктора копий
- •Перегруженная операция присваивания
- •Основной способ наследования в C++
- •Пример: одиночное наследование
- •Переопределение методов
- •Пример: переопределение методов
- •Динамическое приведение типов
- •Пример: динамическое приведение типов не всегда допустимо
- •Пример: динамическое приведение типов
- •private- и protected-наследование
- •Наследование от нескольких базовых классов
- •Иерархия наследования и классы противоречия
- •Неоднозначности в противоречивых иерархиях
- •Разрешение неоднозначностей
- •Основная проблема противоречивых иерархий
- •Виртуальное наследование
- •Пример: виртуальное наследование
- •Понятие шаблона
- •Типовые формальные параметры шаблона
- •Нетиповые формальные параметры шаблона
- •Шаблонные формальные параметры шаблона
- •Значения параметров шаблона по умолчанию
- •Зависимые идентификаторы в шаблоне
- •Инстанциация шаблонов
- •Выведение фактических параметров при инстанциации шаблона функции
- •Требования к фактическим параметрам шаблонов
- •Специализация шаблона функции
- •Пример: специализация шаблона функции
- •Пример: перегрузка имеет больший приоритет, чем специализация
- •Cпециализация шаблона класса
- •Пример: специализация шаблона класса
- •Частичная специализация шаблона класса
- •Вычисления во время компиляции
- •Пример: возведение числа в степень
- •Понятие перегрузки операций
- •Ассортимент перегружаемых операций
- •Перегрузка операции присваивания
- •Операция присваивания возвращает левое значение
- •Составные операции присваивания
- •Перегрузка бинарных арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операций с помощью функций
- •Перегрузка унарных операций
- •Перегрузка операции приведения типа
- •Исключения
- •Оператор throw
- •Пример: оператор throw
- •Синтаксис try- и catch-блоков
- •Пример: перехват исключения std::bad_alloc
- •Жизненный цикл объектов-исключений
- •Пример 1: жизненный цикл объектов-исключений
- •Пример 2: жизненный цикл объектов-исключений
- •Пример 3: жизненный цикл объектов-исключений
- •Пример: уничтожение автоматических объектов в процессе передачи исключения в catch-блок
- •Перехват исключений в инициализаторах конструкторов
- •Пример: перехват исключений в инициализаторах конструкторов
- •Спецификатор throw в заголовках функций
- •Пример 1: спецификатор throw
- •Пример 2: спецификатор throw
- •Спецификатор throw и переопределение виртуальных методов
- •Создание классов исключений
- •Пример: создание классов исключений
Cпециализация шаблона класса
Базовые
сведения
Обобщённое программирова- ние
Объявление
шаблонов
Порождение |
1 |
|
кода |
2 |
|
Специализация |
||
|
||
шаблонов |
3 |
|
Перегрузка |
4 |
|
операций |
5 |
|
|
||
Исключения |
6 |
|
|
7 |
|
|
8 |
|
|
9 |
|
|
10 |
|
|
11 |
|
|
12 |
|
|
13 |
|
|
14 |
|
|
15 |
Специализированные версии шаблонов классов создаются аналогично специализации шаблонов функций. Например, рассмотрим шаблон класса, представляющего кортежи фиксированной длины:
template < typename T , size_t N > class Tuple
{
private :
T a[N ];
public : |
|
T get ( int i ); |
|
void set ( int i , T |
x ); |
}; |
|
template < typename T , |
size_t N > |
T Tuple <T ,N >:: get ( int |
i) { return a[i ]; } |
template < typename T , size_t N >
void Tuple <T ,N >:: set ( int i , T x) { a[i] = x; }
62 / 99
Пример: специализация шаблона класса
Базовые |
|
|
сведения |
17 |
|
Обобщённое |
18 |
|
|
||
программирова- |
19 |
|
ние |
||
20 |
||
Объявление |
||
|
||
шаблонов |
21 |
|
Порождение |
||
22 |
||
кода |
||
|
||
Специализация |
23 |
|
шаблонов |
24 |
|
|
||
Перегрузка |
25 |
|
операций |
||
|
||
|
26 |
|
Исключения |
27 |
|
|
||
|
28 |
|
|
29 |
|
|
30 |
|
|
31 |
|
|
32 |
|
|
33 |
|
|
34 |
|
|
35 |
template <> |
|
class Tuple < bool , |
8> |
{ |
|
private : |
|
unsigned char |
a; |
public : |
|
bool get ( int i );
void set ( int i , bool x );
};
bool Tuple < bool ,8 >:: get ( int i)
{
return (a >> i) & 1;
}
void |
Tuple < bool ,8 >:: set ( int |
i , bool x) |
{ |
|
|
a |
|= ( unsigned char )x << |
i; |
} |
|
|
63 / 99
Частичная специализация шаблона класса
Базовые |
|
|
сведения |
|
|
Обобщённое |
|
|
программирова- |
|
|
ние |
37 |
|
Объявление |
38 |
|
шаблонов |
||
|
||
Порождение |
39 |
|
кода |
40 |
|
Специализация |
||
41 |
||
шаблонов |
||
|
||
Перегрузка |
42 |
|
|
||
операций |
43 |
|
Исключения |
44 |
|
|
45 |
|
|
46 |
|
|
47 |
|
|
48 |
|
|
49 |
|
|
50 |
|
|
51 |
При частичной специализации фиксируется только часть фактических параметров шаблона. Например,
template < typename T > class Tuple <T ,1 >
{
private : T a;
public :
T get ( int i );
void set ( int i , T x );
};
template < typename T >
T Tuple <T ,1 >:: get ( int i) { return a; }
template < typename T >
void Tuple <T ,1 >:: set ( int i , T x) { a = x; }
64 / 99
Вычисления во время компиляции
Базовые
сведения
Обобщённое программирова- ние
Объявление
шаблонов
Порождение |
5 |
|
кода |
||
|
||
Специализация |
6 |
|
шаблонов |
7 |
|
|
||
Перегрузка |
8 |
|
операций |
||
|
||
|
9 |
|
Исключения |
10 |
|
|
||
|
11 |
|
|
12 |
|
|
13 |
|
|
14 |
|
|
15 |
|
|
16 |
|
|
17 |
|
|
18 |
|
|
19 |
|
|
20 |
Специализация шаблонов позволяет заставить компилятор выполнить некоторые вычисления во время компиляции. Например, можно попросить компилятор вычислить факториал числа:
template <int N > |
|
||
struct Fact |
{ |
|
|
static |
const unsigned long val = |
||
N |
* |
Fact <N -1 >:: val ; |
|
}; |
|
|
|
template |
<> |
|
|
struct Fact <0 > { |
|
||
static |
const unsigned |
long val = 1; |
|
}; |
|
|
|
int main () |
|
|
|
{ |
|
|
|
cout |
<< |
Fact <3 >:: val |
<< ’\n ’; |
return |
0; |
|
|
} |
|
|
65 / 99 |