Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Перегрузка функций
В предыдущих разделах мы создали функцию sum()
, предназначенную для суммирования двух целых чисел. В один прекрасный момент возникнет ситуация, когда потребуется произвести суммирование вещественных чисел. Что в этом случае делать? Создавать функцию с другим названием? В языке C++ существует решение этой ситуации, называемое перегрузкой функции. Перегрузка функции — это возможность использования одного названия для нескольких функций, различающихся типом параметров или их количеством. Изменение только типа возвращаемого значения недостаточно для перегрузки функции. В качестве примера перегрузим функцию sum()
таким образом, чтобы ее название можно было использовать для суммирования как целых чисел, так и вещественных (листинг 12.17).
Листинг 12.17. Перегрузка функций
#include <iostream>
int sum(int x, int y);
double sum(double x, double y);
int main() {
// Суммирование целых чисел
std::cout << sum(10, 20) << std::endl; // 30
// Суммирование вещественных чисел
std::cout << sum(10.5, 20.7) << std::endl; // 31.2
return 0;
}
int sum(int x, int y) {
return x + y;
}
double sum(double x, double y) {
return x + y;
}
При вызове перегруженной функции может возникнуть неоднозначность, при которой компилятор не может выбрать, какую функцию следует вызвать. Виновниками таких ситуаций бывают значения по умолчанию, автоматическое преобразование типа при передаче значения в функцию, а также возможность множественной записи при объявлении параметра. Пример проблемы при использовании значений по умолчанию:
int sum(int x);
int sum(int x, int y=2);
...
std::cout << sum(10, 20) << std::endl; // Нормально
std::cout << sum(10) << std::endl; // Неоднозначность
В следующем примере нельзя сделать выбор в какой тип данных (в тип float
или double
) следует автоматически преобразовать целое число:
float sum(float x, float y);
double sum(double x, double y);
...
std::cout << sum(10.5, 20.4) << std::endl; // Нормально
std::cout << sum(10, 20) << std::endl; // Неоднозначность
Если бы существовала функция только с параметрами, имеющими тип double
, то целое число было бы автоматически преобразовано в тип double
. Аналогичная проблема возникает при одновременном использовании знакового и без знакового типов:
void print(char ch);
void print(unsigned char ch);
...
print('S'); // Нормально
print(119); // Неоднозначность
Следующий пример демонстрирует проблему из-за возможности множественной записи при объявлении параметра (объявление char *str
эквивалентно char str[]
):
void print(const char *str);
void print(const char str[]);
...
print("String"); // Неоднозначность
Кроме того, следует учитывать, что разный способ передачи параметров в функцию также может приводить к неоднозначности:
void print(int x);
void print(int &x);
...
int n = 25;
print(n); // Неоднозначность
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов