- •Программирование и основы алгоритмизации Практикум
- •Введение
- •Лабораторная работа № 1 "простейшие вычисления"
- •Краткие теоретические сведения
- •Структура программы.
- •Константы и переменные
- •Операции
- •Выражения
- •Ввод и вывод
- •Функция вывода
- •Функция ввода
- •Постановка задачи
- •Варианты.
- •Методические указания
- •Постановка задачи
- •Варианты Задание 1.
- •Задание 2.
- •Лабораторная работа № 3 "вычисление функций их сумм и произведений при помощи циклических алгоритмов"
- •Краткие теоретические сведения Операторы циклов.
- •Цикл с предусловием
- •Цикл с постусловием
- •Цикл с параметром
- •Операторы передачи управления
- •Постановка задачи
- •Варианты Задание 1.
- •Задание 2.
- •Методические указания
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа № 4 "работа с одномерными массивами"
- •Краткие теоретические сведения.
- •Обработка одномерных массивов.
- •Формирование псевдодинамических массивов.
- •Использование датчика случайных чисел для формирования массива.
- •Перебор массива по два элемента.
- •Варианты
- •Методические указания
- •Двумерные массивы
- •Одномерные и двумерные массивы
- •«Многомерные массивы»
- •Определение количества элементов массива в программе.
- •Постановка задачи
- •Варианты
- •Дополнительные задания
- •«Динамические массивы»
- •Формирование динамических массивов с использованием операций new и delete.
- •Постановка задачи
- •Порядок выполнения работы
- •Варианты
- •«Работа со строками»
- •Постановка задачи
- •Варианты
- •«Структуры»
- •Инициализация структур
- •Присваивание структур
- •Доступ к элементам структур
- •Указатели на структуры
- •Постановка задачи.
- •Варианты
- •«Полиморфизм в объектно-ориентированном программировании. Перегрузка функций»
- •Постановка задачи
- •Варианты
- •«Функции с переменным числом параметров»
- •Постановка задачи
- •Варианты
- •Доступность компонентов класса.
- •Указатель this
- •Конструктор
- •Конструктор копирования
- •Деструктор
- •Указатели на компоненты-функции
- •Порядок выполнения работы.
- •Методические указания.
- •Варианты
- •Содержание отчета.
- •Контрольные вопросы
- •Лабораторная работа № 12
- •Краткие теоретические сведения.
- •Бинарные и унарные операции
- •Предопределенные значения операций
- •Операции и определяемые пользователем типы
- •Определяемое преобразование типа
- •Конструкторы
- •Перегрузка операций new и delete
- •Перегрузка операции приведения типа
- •Перегрузка операции вызова функции
- •Перегрузка операции индексирования
- •Порядок выполнения работы.
- •Варианты задания.
- •Методические указания. Пример решения задачи
- •Содержание отчета.
- •Контрольные вопросы
- •Лабораторная работа № 13 «наследование и виртуальные функции»
- •Краткие теоретические сведения.
- •Указатель this
- •Наследование
- •Конструкторы и деструкторы производных классов
- •Виртуальные функции
- •Абстрактные классы
- •Порядок выполнения работы.
- •Варианты заданий.
- •Методические указания.
- •Содержание отчета.
- •Контрольные вопросы.
- •Самостоятельная работа № 1 «шаблоны функций и классов»
- •Краткие теоретические сведения.
- •Основные свойства параметров шаблона функции
- •Шаблон класса
- •Основные свойства шаблонов классов
- •Компонентные функции
- •Порядок выполнения работы.
- •Варианты заданий.
- •Содержание отчета.
- •Контрольные вопросы
- •Самостоятельная работа № 2 «потоковые классы»
- •Краткие теоретические сведения.
- •Пример шаблона потокового класса.
- •Базовые потоки ввода-вывода
- •Форматирование
- •Манипуляторы
- •Определение пользовательских манипуляторов
- •Файловый ввод-вывод
- •Порядок выполнения работы.
- •Методические указания
- •Распечатка исходных данных и результатов выполнения программы.
- •Литература
«Полиморфизм в объектно-ориентированном программировании. Перегрузка функций»
Цель. Получить практические навыки реализации перегрузки функций на С++.
Краткое теоретическое введение
Перегрузка функций является одной из особенностей ООП, отражающее свойство полиморфизма. Перегрузка функций (function overloading) позволяет определять несколько функций с одним и тем же именем, если эти функции имеют различное количество и(или) типы аргументов. Перегрузка функций обычно используется для создания функций, предназначенных для выполнения однотипных задач, оперирующих с различными структурами и типа данных. Не являются перегруженными функции, которые имеют одинаковый список аргументов и различные типы возвращаемых значений. При вызове перегруженной функции компилятор определяет адрес вызова нужной функции путем анализа количества, типа и порядка следования аргументов функции. Каждая перегруженная функция имеет свой уникальный идентификатор, называемый сигнатурой.
Цель перегрузки функций состоит в том, чтобы функция с одним именем по-разному выполнялась и возвращала разные значения при обращении к ней с разными по типам и количеству фактическими параметрами. Например, может потребоваться функция, возвращающая максимальное из значений элементов одномерного массива, передаваемого ей в качестве параметра. Массивы, использованные как фактические параметры, могут содержать элементы разных типов, но пользователь функции не должен беспокоиться о типе результата. Функция всегда должна возвращать значение того же типа, что и тип массива - фактического параметра.
Для обеспечения перегрузки функций необходимо для каждого имени определить, сколько разных функций связано с ним, т.е. сколько вариантов сигнатур допустимы при обращении к ним. Предположим, что функция выбора максимального значения элемента из массива должна работать для массивов типа int, long, float, double. В этом случае придется написать четыре разных варианта функции с одним и тем же именем.
Распознавание перегруженных функций при вызове выполняется по их сигнатурам. Перегруженные функции поэтому должны иметь одинаковые имена, но спецификации их параметров должны различаться по количеству и (или) по типам, и (или) по расположению.
При использовании перегруженных функций нужно с осторожностью задавать начальные значения их параметров.
Для обеспечения перегрузки функций необходимо для каждого имени функции определить сколько различных функций с ним связано.
Пример:
#include <iostream.h>
int max_element ( int n, int a[ ])
// находит максимальный элемент для массива типа int
{
int max=a[0];
for ( i=1; i<n; i++)
if (a[i]>max) max=a[i];
return max;
}
long max_element ( int n, long a[ ])
// находит максимальный элемент для массива типа long
{
long max=a[0];
for ( i=1; i<n; i++)
if (a[i]>max) max=a[i];
return max;
}
double max_element ( int n, double a[ ])
// находит максимальный элемент для массива типа double
{
double max=a[0];
for ( i=1; i<n; i++)
if (a[i]>max) max=a[i];
return max;
}
float max_element ( int n, float a[ ])
// находит максимальный элемент для массива типа float
{
float max=a[0];
for ( i=1; i<n; i++)
if (a[i]>max) max=a[i];
return max;
}
void main ( )
{
int x[]={10, 20, 30, 40, 50, 60};
long y[]={12, 44, 22, 37,30};
. . . . . .
int m1=max_element(6, x );
long m2=max_element(5, y);
. . . . .
}
