- •1.1.1 Пример программы, выводящей текст на экран (пример 1)
- •1.1.2 Директивы препроцессору (подключение заголовочных файлов)
- •1.1.3 Комментарии
- •1.1.4 Функции
- •1.1.5 Ввод и вывод на экран
- •1.2. Переменные и их объявление
- •1.2.1 Пример программы cложения целых чисел (пример 2)
- •1.2.2 Переменные и их объявление
- •1.3. Арифметические операторы
- •1.3.1 Примеры арифметических операций (пример 3)
- •1.3.2 Группировка подвыражений с помощью скобок
- •1.4. Логические выражения и оператор if
- •1.4.1 Условные конструкции. Пример условных конструкций (пример 4)
- •1.4.2 Логические выражения. Логические операции и, или, не (пример 5)
- •1.4.3 Типичные ошибки
- •1.4.4 Вложенные условия
- •1.5. Арифметический логический оператор (пример 6)
- •1.6. Селективные конструкции
- •1.6.1 Селективные конструкции. Пример определения оценки в зависимости от количества баллов (пример 6)
- •1.6.2 Оператор Switch. Пример меню с выбором действия (пример 7)
- •1.7. Циклы while и do…while
- •1.7.1 Цикл с предусловием while. Пример возведения в степень в цикле (пример 8)
- •1.7.2 Цикл с постусловием do...While
- •1.8. Пошаговый цикл for
- •1.8.1 Пример работы оператора for - вычисление суммы чисел (пример 9)
- •1.8.2 Пошаговый цикл for
- •1.8.3 Операторы break и continue
- •1.8.4 Пример вычисление факториала (пример 10)
- •1.9. Функции
- •1.9.1 Использование функций библиотеки stl (пример 11)
- •1.9.2 Определение новых функций
- •1.9.3 Пример функции (пример 12)
- •1.10. Размещение программ и данных в памяти
- •1.11. Ссылки и указатели
- •1.11.1. Ссылки
- •1.11.2. Указатели
- •1.11.3. Передача параметров в функцию по ссылке и указателю
- •2.2 Организация ввода/вывода
- •2.3 Строковые переменные и константы
- •2.4 Математические функции
- •3.1. Массивы
- •3.1.1. Одномерный массив
- •3.1.2. Динамическое размещение одномерного массива
- •3.1.3. Передача массива в функцию (пример 3.1)
- •3.1.4. Двумерный массив
- •3.1.5. Динамическое размещение двумерного массива (пример 3.2)
- •3.2 Контейнеры
- •3.3. Вектор vector (пример 3.3)
- •4.4. Список list
- •3.4.1. Списки
- •3.4.2. Итераторы
- •3.4.3. Пример работы со списком с использованием итераторов (пример 3.4)
- •3.5. Очереди и стек
- •3.5.1. Двусторонняя очередь deque (пример 3.5)
- •3.5.2. Стек stack
- •3.5.3. Очередь queue
- •3.6. Ассоциативные контейнеры
- •3.6.1. Контейнер map (пример 3.7)
- •3.6.2. Контейнер set (пример 3.8)
- •3.7. Алгоритмы
- •4.1 Структуры
- •4.1.1. Пример 4.1. Структура для работы с компонентами цвета
- •4.1.2. Передача абстрактных типов в функцию
- •4.1.3. Создание функций-членов для абстрактного типа данных. Пример 4.2. Структура для работы с компонентами цвета со встроенной функцией.
- •4.2. Классы
- •4.2.1. Пример 4.3. Класс Линза
- •4.2.2. Директивы препроцессору # if ! defined, # endif (проверка на повторное подключение)
- •4.2.3. Тип доступа к членам класса
- •4.2.4. Принципы объектно-ориентированного проектирования
- •4.2.5. Типы функций-членов класса
- •4.3 Конструкторы и деструкторы класса
- •4.3.1. Конструкторы
- •4.3.2. Деструктор (пример 4.4. Конструктор и деструктор класса Матрица)
- •4.3.3. Проверка правильности параметров. Исключительные ситуации
- •4.4. Модификаторы, селекторы и другие члены классов
- •4.4.1. Модификаторы и селекторы
- •4.4.2. Ключевые слова const и inline
- •4.4.3. Функции-утилиты
- •4.4.4. Сохраняемость
- •5.1. Типы наследования. Видимость членов классов
- •5.1.1. Наследование
- •5.1.2. Пример 5.1. Линза и зеркало как оптические детали
- •5.1.3. Последовательность вызова конструкторов
- •5.1.4. Типы наследования. Видимость членов классов
- •5.1.5. Множественное наследование
- •5.2. Виртуальные функции. Абстрактные классы
- •5.2.1. Виртуальные функции
- •5.2.2. Абстрактные классы
- •6. Полиморфизм
- •6.1. Перегрузка функций
- •6.1.1. Перегрузка функций
- •6.1.2. Преобразование типов
- •6.1.3. Параметры функций по умолчанию
- •6.2. Перегрузка операторов
- •6.2.1. Пример 6.1 (класс Complex (комплексное число))
- •6.2.6. Перегрузка операторов с присваиванием
- •6.2.7. Перегрузка преобразования типов
- •6.2.8. Перегрузка оператора доступа по индексу
- •6.2.9. Перегрузка операторов ввода/вывода
- •6.2.10. Неперегружаемые операторы
- •6.3. Шаблоны функций и классов
- •6.3.1. Шаблоны функций. Пример 6.2 (шаблон функции)
- •6.3.2. Шаблоны функций с несколькими параметрами. Пример 6.3 (шаблон функции с несколькими параметрами)
- •6.3.3. Шаблоны классов. Пример 6.4 (шаблон класса Комплексное число)
- •6.4. Объекты-функции. Предикаты
- •6.4.1. Объекты-функции. Пример 6.5 (использование объектов-функций)
- •6.4.2. Предикаты. Пример 6.6 (использование предикатов)
6.3. Шаблоны функций и классов
Параметрический полиморфизм - еще одно из проявлений принципа полиморфизма, которое позволяет многократно использовать один и тот же код применительно к разным типам. Реализация функции или класса осуществляется один раз, но при этом тип указывается как параметр этой функции или класса. При использовании этой функции или класса параметра типа заменяется на встроенный или абстрактный тип данных и универсальных код, не зависящий от типа, работает с указанным типом. Существуют целые библиотеки таких функций и классов (например, STL) и такая технология называется обобщенное программирование.
Шаблоны (templates) – средство для реализаций параметризированных классов и функций на языке С++.
6.3.1. Шаблоны функций. Пример 6.2 (шаблон функции)
Если функция выполняет одни и те же действия над аргументами различных типов, можно параметризировать такую функцию, то есть оформить в виде шаблона. Например:
void swap(int& x, int& y) { int temp=x; x=y; y=temp; } |
template<class TYPE> void swap(TYPE& x, TYPE& y) { TYPE temp=x; x=y; y=temp; } |
Для создания шаблона мы заменили тип int на лексему TYPE с помощью ключевого слова template в скобках <>. Компилятор же выполнит замену наоборот, он заменит лексему TYPE на любой тип, который ему указать:
// использование шаблона
double x=1.5, y=1.6;
swap<double>(x,y); // в данном случае тип double
Генерация функции по шаблону и ее аргументу называется инстанцирование. Возможно выведение типа аргумента шаблона по типам его аргументов, но лучше явно указывать параметр в скобках <>.
/////////////////////////////////////////////////////////////////////////////
// Прикладное программирование
// Пример 6.2. Шаблон функции
//
// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru
// СПб НИУ ИТМО
/////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
using namespace std;
/////////////////////////////////////////////////////////////////////////////
// шаблон функции, меняющий местами значения двух переменных
// TYPE - параметр шаблона (тип данных переменных)
template<class TYPE>
void Swap(TYPE& x, TYPE& y)
{
TYPE temp=x;
x=y;
y=temp;
}
/////////////////////////////////////////////////////////////////////////////
// тестирование шаблона функции
void main()
{
double dx=1.5, dy=1.6;
cout<<dx<<" "<<dy<<endl;
Swap<double>(dx, dy); // TYPE заменяется на double
cout<<dx<<" "<<dy<<endl;
int ix=1, iy=5;
cout<<ix<<" "<<iy<<endl;
Swap<int>(ix, iy); // TYPE заменяется на int
cout<<ix<<" "<<iy<<endl;
string sx="one", sy="two";
cout<<sx<<" "<<sy<<endl;
Swap<string>(sx, sy); // TYPE заменяется на string
cout<<sx<<" "<<sy<<endl<<endl;
}
6.3.2. Шаблоны функций с несколькими параметрами. Пример 6.3 (шаблон функции с несколькими параметрами)
Часто возникает необходимость использовать несколько параметров у одной функции шаблона. При этом в качестве параметра может использоваться не только тип данных, но и числовое значение.
/////////////////////////////////////////////////////////////////////////////
// Прикладное программирование
// Пример 6.3. Шаблоны функций с несколькими параметрами
//
// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru
// СПб НИУ ИТМО
/////////////////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;
/////////////////////////////////////////////////////////////////////////////
// шаблон функции с двумя параметрами TYPE1 и TYPE2
// преобразование переменно x типа TYPE1 к типу TYPE2
template<class TYPE1, class TYPE2>
bool transform(TYPE1 x, TYPE2& y)
{
if(sizeof(y) < sizeof(x))
return false;
y=(TYPE2)x;
return true;
}
/////////////////////////////////////////////////////////////////////////////
// шаблон функции с двумя параметрами: типом и числовым значением
// функция вычисляет факториал числа n
template<class TYPE, int n>
TYPE factorial()
{
TYPE sum=1;
int i=1;
while(i<=n)
{
sum*=i;
i++;
}
return sum;
}
/////////////////////////////////////////////////////////////////////////////
// тестирование шаблона функции с несколькими параметрами
void main()
{
int x=1;
double y;
// преобразование типа int в double
transform<int, double>(x, y);
cout<<"double("<<x<<")="<<y<<endl<<endl;
double res=factorial<double, 4>();
cout<<"4!="<<res<<endl;
}
/////////////////////////////////////////////////////////////////////////////
