Перегрузка функций
Технику, обеспечивающую возможность ввести новую интерпретацию уже используемых знаков операций или одинаковых имён функций для различных списков параметров, называют перегрузкой. Перегрузка функций используется для создания нескольких функций с одинаковым именем, предназначенных для выполнения сходных по смыслу действий над разными типами данных. 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);