- •10. Константы. Правила построения и создания своих собственных (перечислимых) констант.
- •11. Литерные константы (видимые). Литерные константы esc-последовательности. Расширенная таблица ascii. Пример программы.
- •12. Строковые константы. Особенности и примеры их применения.
- •13. Числовые целые константы. Особенности и примеры их применения.
- •14. Числовые вещественные константы. Особенности и примеры их применения.
- •15. Операция присваивания. Пример линейной программы.
- •16. Синтаксис и семантика операторов выражения, перехода и возврата, ветвления и выбора. Пример программы ветвления.
- •17. Синтаксис и семантика операторов цикла, прерывания и продолжения. Пример циклической программы.
- •18. Классификация типов данных. Основные и производные типы данных. Правила преобразования арифметических типов: по умолчанию и явное.
- •19. Арифметические операции и их приоритеты.
- •20. Логические операции. Синтаксис и семантика. Условная операция.
- •21. Виды выражений. Приоритеты операций.
- •22. Символьный тип данных. Операции над данными символьного типа.
- •23. Одномерные массивы. Индексация выражения. Массив как параметр функций.
- •24. Многомерные массивы. Индексация выражения. Массив как параметр функций.
- •25. Массивы с элементами типа char и строковые массивы.
- •26. Указатели: понятие, синтаксис и семантика объявления. Операция выделения значения. Адрес-константа. Операции адресации, адресная арифметика.
- •27. Взаимодействие между массивами и указателями. Динамические массивы. Операции выделения и освобождения памяти.
- •28. Тип данных «структура». Объявление, синтаксис и особенности использования.
- •29. Динамические типы данных. Список. Основные операции над элементами списка. Примеры.
- •30. Динамические типы данных. Очередь. Основные операции над элементами очереди. Примеры.
- •31. Динамические типы данных. Стек. Основные операции над элементами стека. Примеры.
- •32. Динамические типы данных. Бинарное сбалансированное дерево. Правила обхода. Основные операции над элементами. Примеры.
- •33. Классы памяти. Точки описания переменных. Автоматическая, регистровая, внешняя, статическая память. Области объявления и видимости имен переменных. Примеры.
- •34. Ссылки: понятие, синтаксис и семантика объявления. Примеры использования.
- •35. Синтаксис, семантика и прагматика функций. Указатели функций. Примеры.
- •36. Механизм передачи значений между параметрами и аргументами функции. Примеры.
- •37. Рекурсивные функции. Примеры явной и косвенной рекурсии.
- •38. Перегрузка функций. Шаблоны функций. Примеры.
- •39. Препроцессор. Команды препроцессора. Использование макроподстановок и макроимен. Команды условной компиляции.
- •40. Объектно-ориентированное программирование. Инкапсуляция, наследование, полиморфизм.
- •41. Понятие объекта и класса. Данные и методы. Инкапсуляция данных и методов класса.
- •42. Тип данных class. Статусы доступа к данным. Указатель this. Конструкторы и деструкторы.
- •43. Дружественные функции, методы, классы. Статические члены класса.
- •44 Наследование классов и производные классы.
38. Перегрузка функций. Шаблоны функций. Примеры.
Использование нескольких функций с одним и тем же именем, но с различными типами параметров, называется перегрузкой функций.
Компилятор определяет, какую именно функцию требуется вызвать, по типу фактических параметров. Этот процесс называется разрешением перегрузки (перевод английского слова resolution в смысле «уточнение»). Тип возвращаемого функцией значения в разрешении не участвует. Механизм разрешения основан на достаточно сложном наборе правил, смысл которых сводится к тому, чтобы использовать функцию с наиболее подходящими аргументами и выдать сообщение, если такой не найдется.
Если соответствие
на одном и том же этапе может быть получено более чем одним способом, вызов
считается неоднозначным и выдается сообщение об ошибке.
Неоднозначность может появиться при:
преобразовании типа;
использовании параметров-ссылок;
использовании аргументов по умолчанию.
Ниже приведены правила описания перегруженных функций.
Перегруженные функции должны находиться в одной области видимости, иначе произойдет сокрытие аналогично одинаковым именам переменных во вложенных блоках.
Перегруженные функции могут иметь параметры по умолчанию, при этом значения одного и того же параметра в разных функциях должны совпадать. В различных вариантах перегруженных функций может быть различное количество параметров по умолчанию.
Функции не могут быть перегружены, если описание их параметров отличается только модификатором const или использованием ссылки (например, int и const int или int и int&).
Шаблоны функций
Многие алгоритмы не зависят от типов данных, с которыми они работают (классический пример — сортировка). Естественно желание параметризовать алгоритм таким образом, чтобы его можно было использовать для различных типов данных.
В C++ есть мощное средство параметризации — шаблоны. Существуют шаблоны функций и шаблоны классов.
С помощью шаблона функции можно определить алгоритм, который будет применяться к данным различных типов, а конкретный тип данных передается функции в виде параметра на этапе компиляции. Компилятор автоматически генерирует правильный код, соответствующий переданному типу. Таким образом, создается функция, которая автоматически перегружает сама себя и при этом не содержит накладных расходов, связанных с параметризацией.
Формат простейшей функции-шаблона:
template <class Туре> заголовок{
/* тело функции */
}
Вместо слова Туре может использоваться произвольное имя.
Например, функция, сортирующая методом выбора Массив из n элементов любого типа, в виде шаблона может выглядеть так:
template <class Туре>
void sort_vybor(Type *b, int n){
Type a; //буферная переменная для обмена элементов
for (int i = 0; i<n-l; 1++){
int imin = i;
for (int j = i + 1; j<n: j++)
if (b[j] < b[imin]) imin = j ;
а = b[i]; b[i] = b[imin]; b[imin] = а;
}}
Первый же вызов функции, который использует конкретный тип данных, приводит к созданию компилятором кода для соответствующей версии функции. Этот процесс называется инстанцированием шаблона (instantiation). Конкретный тип для инстанцирования либо определяется компилятором автоматически, исходя из типов параметров при вызове функции, либо задается явным образом.