
- •Часть 2
- •Раздел 3. Основы программирования
- •1.Цель работы
- •2.Контрольные вопросы
- •3.Методические указания
- •3.2.Структура программы
- •3.3.Имена и зарезервированные слова
- •3.4.Специальные символы
- •3.5.Константы и переменные
- •3.6.Оператор присваивания
- •Листинг 3.4. Пример множественного присваивания
- •3.7.Комментарии
- •4.Задание
- •Лабораторная работа №2 Арифметические операции и функции
- •1.Цель работы
- •2.Контрольные вопросы
- •3.Методические указания
- •3.1.Типы целых чисел
- •3.2.Типы вещественных чисел
- •3.3.Арифметические выражения
- •3.4.Функции
- •3.5.Преобразование типов
- •4.Задание
- •Лабораторная работа №3 Ввод и вывод данных
- •1.Цель работы
- •2.Контрольные вопросы
- •3.Методические указания
- •3.1. Ввод и вывод
- •3.2.Дополнительные возможности ввода/вывода
- •3.3.Форматированный ввод/вывод
- •4.Задание
- •Лабораторная работа №4 Логические операции
- •1.Цель работы
- •2.Контрольные вопросы
- •3.Методические указания
- •3.1. Условный оператор
- •3.2.Условная операция
- •3.3.Оператор выбора
- •3.4.Составной оператор
- •3.5.Сложные условия
- •3.6.Тип bool(логический)
- •3.7.Особенности работы условного оператора
- •4.Задание
- •Лабораторная работа №5 Циклические операции
- •1.Цель работы
- •2.Контрольные вопросы
- •3.Методические указания
- •3.1. Оператор цикла while (цикл с предусловием)
- •3.2.Оператор цикла do (цикл с постусловием)
- •3.3.Оператор цикла for (счетный цикл)
- •3.4.Вложенные циклы
- •3.5.Операторы прерывания цикла
- •4.Задание
- •Лабораторная работа №6 Указатели и массивы
- •1.Цель работы
- •2.Контрольные вопросы
- •3.Методические указания
- •3.1. Указатели
- •3.2.Константные указатели и указатели-константы
- •3.3.Операции над указателями
- •3.4.Массивы
- •3.5.Одномерные массивы
- •3.6.Указатели на массивы
- •3.7.Инициализация массивов
- •3.8.Операция sizeof
- •3.9.Определение новых типов
- •3.10.Многомерные массивы
- •4.Задание
- •Лабораторная работа №7 Функции и процедуры
- •1.Цель работы
- •2.Контрольные вопросы
- •3.Методические указания
- •3.1.Описание функций
- •3.2.Процедуры
- •3.3.Параметр-ссылка
- •3.4.Область видимости переменных
- •4.Задание
- •Лабораторная работа №8 Перегрузка функций
- •1.Цель работы
- •2.Контрольные вопросы
- •3.Методические указания
- •3.1.Полиморфизм
- •3.2.Перегрузка функций
- •3.3.Особенности перегрузки функций
- •3.4.Использование параметров по умолчанию
- •4.Задание
- •Лабораторная работа №9 Перечисления
- •1.Цель работы
- •2.Контрольные вопросы
- •3.Методические указания
- •4.Задание
- •Лабораторная работа №10 Строки символов
- •1.Цель работы
- •2.Контрольные вопросы
- •3.Методические указания
- •3.1.Данные типа char
- •3.2.Строковый тип string
- •4.Задание
2.Контрольные вопросы
2.1.Что такое перегрузка функций?
2.2.Дайте определение понятия полиформизм?
2.3.В чем заключается использование параметра по умолчанию?
3.Методические указания
Важной и необычной возможностью языка C++ является перегрузка функций (function overloading). Перегрузка функций в языке C++ заключается в том, что две и более функций могут иметь одно и то же имя, отличаясь либо типом, либо числом своих аргументов, либо и тем и другим. Если две или более функций имеют одинаковое имя, говорят, что они перегружены. Перегружаемые функции дают возможность упростить программы, допуская обращение к одному имени для выполнения близких по смыслу действий.
3.1.Полиморфизм
Одно из основных применений перегрузки функций - это достижение полиморфизма при компиляции программ. Полиморфизм (Polymorphism) (от греческого polymorphos) - это свойство, которое позволяет одно и то же имя использовать для решения двух или более задач технически разных. В более общем смысле, концепцией полиморфизма является идея "один интерфейс, множество методов". Это означает, что можно создать общий интерфейс для группы близких по смыслу действий. При этом выполнение конкретного действия зависит от данных.
Преимуществом полиморфизма является то, что он помогает снижать сложность программ, разрешая использование одного и того же интерфейса для задания единого класса действий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор. Вам, программисту, не нужно делать этот выбор самому. Необходимо только помнить и использовать общий интерфейс. Например, для языка С, в котором полиморфизм поддерживается недостаточно, нахождение абсолютной величины числа требует трех различных функций: abs(), labs() u fabs(). Эти функции подсчитывают и возвращают абсолютную величину целых, длинных целых и чисел с плавающей точкой соответственно. Однако из-за того, что для трех типов данных требуется три типа функции, ситуация выглядит более сложной, чем это необходимо. Во всех трех случаях возвращается абсолютная величина числа, отличие только в типе данных. В то же время в C++ вы можете исправить эту ситуацию путем перегрузки одного имени для трех типов данных.
3.2.Перегрузка функций
Перегрузить функцию очень легко: просто объявите и задайте все требуемые варианты. Компилятор автоматически выберет правильный вариант вызова на основании числа и/или типа используемых в функции аргументов (Листинг 3.59):
Листинг 3.59. Перегрузка функции Abs()
Как можно заметить, в программе (Листинг 3.47) задано три функции Abs(), своя для каждого типа данных. Внутри main(), Abs() вызывается с тремя аргументами разных типов. Компилятор автоматически вызывает правильную версию Abs(), основываясь на используемом в аргументе типе данных.
Хотя этот пример достаточно прост, целостность перегрузки функций он все же демонстрирует. Поскольку одно имя используется для описания основного набора действий, искусственная сложность, вызванная тремя слабо различающимися именами, в данном случае abs(), labs() и fabs(), устраняется. Теперь Вам необходимо помнить только одно имя - то, которое описывает общее действие. Нa компилятор возлагается задача выбора соответствующей конкретной версии вызываемой функции (а значит и метода обработки данных). Это имеет лавинообразный эффект для снижения сложности программ. В данном случае, благодаря использованию полиморфизма, из трех имен получилось одно.
Хотя использование полиморфизма в этом примере довольно тривиально, Вы должно быть уже поняли, что для очень больших программ подход "один интерфейс, много методов" может быть достаточно эффективным.