- •Часть 1
- •Практическое занятие 1. Работа в среде Microsoft Visual Studio
- •Проекты и решения
- •Создание консольного приложения
- •Отладка в Visual Studio
- •Отладка программ
- •Практическое занятие 3. Операции и выражения. Линейные программы Операции и выражения
- •Логические операции
- •Поразрядные (побитовые) операции
- •Практическое занятие 4. Разветвляющиеся алгоритмы
- •If (выражение) оператор_1 else оператор_2
- •Операции сравнения (отношения)
- •Тернарная (условная) операция
- •Выражение_1 ? выражение_2 : выражение_3
- •Практическое занятие 5. Организация циклов. Операторы цикла
- •Оператор while
- •Оператор do…while
- •Оператор for
- •Операторы передачи управления Оператор break
- •Оператор continue
- •Указатели
- •Инициализация указателей
- •Операции над указателями
- •Одномерные массивы
- •Практическое занятие 7. Двумерные массивы. Организация работы с динамической памятью Двумерные массивы
- •Динамические массивы
- •Практическое занятие 8. Структуры. Форматный ввод/вывод данных. Структуры в языке с
- •Форматный ввод/вывод данных в стиле языка с
- •Int printf(строка_форматир-я [, список_переменных]);
- •Int scanf(const char * строка_форматирования,
- •Практическое занятие 9. Функция. Способы передачи параметров в функцию.
- •Выход из функции
- •Прототип (описание, объявление) функции
- •Рекурсия
- •Передача параметров в функцию
- •Передача массивов в качестве параметров функции
- •Практическое занятие 10. Перегрузка функций. Шаблоны функций Перегрузка функций
- •Перегрузка и область видимости
- •Шаблоны функций
- •Прототип шаблона
- •Параметры шаблона, не являющиеся типами
- •Явная специализация шаблонной функции
- •Директива #include
- •Директива #define
- •Символических констант
- •Макроимён, управляющих условной компиляцией:
- •Препроцессорные операторы # и ##
- •Директива #undef
- •Директивы условной компиляции #if, #ifdef, #ifndef
- •Вспомогательные директивы
- •Практическое занятие 12. Поразрядные операции Операции с разрядами Машинное слово
- •Представление машинных слов в программе
- •Технология работы с машинными словами
- •Поразрядная операция и
- •Поразрядная операция или
- •Операция поразрядной инверсии
- •Поразрядная операция исключающее или
- •Операция сдвиг влево
- •Операция сдвиг вправо
- •Формы представления числовых данных Целое без знака
- •Представление отрицательных чисел Дополнительный код
- •Преобразование типов операндов в выражениях
- •Стандартные программные решения Преобразование типов операндов в выражениях
- •Подсчет количества единичных битов
- •Упаковка данных полями переменной длины
- •Машинная арифметика – целые произвольной точности
- •01000 Хххххххх 00011 ххх 10000 хххххххххххххххх 00000.
- •Практическое занятие 13. Пространства имен
- •Пространство имен std
- •Приложение 1. Простые алгоритмы сортировки одномерных массивов
- •Сортировка простыми обменами (пузырьковая)
- •Сортировка простыми вставками (прямого включения)
- •Приложение 2. Создание файла с результатами препроцессорной обработки в среде Visual Studio
- •Создание файла с результатами препроцессорной обработки из командной строки
- •Приложение 3. Использование генератора случайных чисел
- •Рекомендуемая литература
- •Содержание
Практическое занятие 10. Перегрузка функций. Шаблоны функций Перегрузка функций
Технику, обеспечивающую возможность ввести новую интерпретацию уже используемых знаков операций или одинаковых имён функций для различных списков параметров, называют перегрузкой. Перегрузка функций используется для создания нескольких функций с одинаковым именем, предназначенных для выполнения сходных по смыслу действий над разными типами данных. C++ позволяет перегрузить функции, если эти функции имеют разные наборы параметров (отличающиеся типами, количеством или порядком следования в списке параметров).
При вызове перегруженной функции компилятор С++ осуществляет разрешение перегрузки (resolution) – выбор соответствующей функции путём анализа количества, типов и порядка следования фактических параметров в её вызове. Перегруженные функции различаются с помощью их сигнатуры – комбинации имени функции и типов её параметров. Тип возвращаемого функцией значения при разрешении перегрузки не учитывается.
В листинге 10.1 рассмотрен пример перегрузки функций.
// Листинг 10.1. Использование перегруженных функций
#include <iostream>
using namespace std;
int square(int x) {
cout << "int ";
return x*x;
}
double square(double y) {
cout << "double ";
return y*y;
}
int main() {
// Квадрат целого числа 7
cout << square(7) << endl;
// Квадрат числа 7. типа double
cout << square(7.) << endl;
return 0;
}
Результат выполнения программы:
int 49
double 49
Перегруженные функции не обязательно должны иметь одинаковое количество параметров. Создание перегруженных функций с идентичными списками параметров и различными типами возвращаемых значений приводит к синтаксической ошибке. Например, если попытаться в С++ перегрузить функции Max() таким образом:
double Max(int x, int y) {
return (x > y) ? x : y;
}
int Max(int x, int y) {
return (x > y) ? x : y;
}
компилятор выдаст сообщения об ошибках:
error C2371: 'Max' : redefinition; different basic types
error C2556: 'int Max(int,int)' : overloaded function differs only by return type from 'double Max(int,int)'
В С++ прототипы перегруженных функций могут выглядеть, например, следующим образом:
double Max(double, double);
int Max(int, int);
char * Max(char *, char *);
int Max(char *, int);
double Max(double, double, double);
int Max(int, int, int);
Перегрузка и область видимости
Функции, объявленные в различных областях видимости (не пространствах имён), не являются перегруженными. Например:
void f4(int);
void g() {
void f4(double);
f4(10); // вызывается f4(double)
::f4(2.5); // вызывается f4(int)
}
void f4(int a) { cout << "int" << a << endl; }
void f4(double a) { cout << "double" << a << endl; }
f4(int) была бы идеальным соответствием для вызова f4(10), но в данной области видимости находится только f4(double). Операция расширения области видимости :: делает видимой только глобальную область, поэтому вызову ::f4(2.5) ставится в соответствие f4(int).
Если нужно, чтобы область действия перегрузки пересекала области видимости пространств имён, можно воспользоваться объявлением using. Объявление using вводит псевдоним для члена пространства имён в ту область видимости, в которой это объявление встречается, оно делает доступными все перегруженные функции с указанным именем:
void f4(int);
void g() {
void f4(double);
using ::f4; // Доступна и f4(int)
f4(10); // Вызывается f4(int)
}
Если using-объявление вводит некоторую функцию в область видимости, в которой уже имеется функция с таким же именем и таким же списком параметров, это считается ошибкой.
Правила использования перегруженных функций:
Перегруженные функции должны находиться в одной области видимости, иначе произойдёт сокрытие их имён аналогично одинаковым именам переменных во вложенных блоках.
Перегруженные функции могут иметь параметры по умолчанию. В различных вариантах перегруженных функций может быть разное число параметров по умолчанию. Не могут быть перегружены функции, отличающиеся только значениями параметров по умолчанию.
Функции не могут быть перегружены, если списки их параметров отличаются только квалификатором const или использованием ссылки (например, int и const int, int и int &).
Функции не могут быть перегружены, если они различаются только по внешнему виду при идентичности реализаций.
