Перегрузка функций

В предыдущих разделах мы создали функцию 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);                     // Неоднозначность

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов