Возможно, кого-то из новичков пугает название темы “Перегрузка функций”? Меня пугало. Казалось – это что-то, с чем придется долго разбираться. На самом деле, перегрузку функций очень легко понять. Сложного нет ничего.
Перегруженные функции – это функции, которые имеют одинаковое имя, но отличаются количеством или типами принимаемых параметров. Либо – и тем и другим.
Для начала определимся в чём заключается суть использования перегруженных функций. Состоит она в том, что вы можете дать одинаковое имя функциям. При этом, они могут по-разному выполняться и возвращать значения разных типов.
Например, функция должна принять массив чисел и вернуть в программу сумму его элементов. Но мы можем передать в функцию массив типа int или типа double. В таком случае можно не давать функциям разные имена. Они ведь по сути выполняют одну и ту же работу, только используют данные разных типов.
В следующей программе определены три перегруженные функции с именем sumElements(). Все они вычисляют сумму элементов массивов. Одна принимает массив типа int и его размер. Вторая принимает массив типа double и его размер. Третья принимает два массива с типом элементов int и double и их размер.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include <iostream> using namespace std; int sumElements(int arrI[], int size); double sumElements(double arrD[], int size); double sumElements(int arrI[], double arrD[], int size); int main() { setlocale(LC_ALL, "rus"); const int Size = 5; int ArrInt[Size] {100, 200, 300, 400, 500}; double ArrDouble[Size] {100.1, 200.2, 300.3, 400.4, 500.5}; cout << "Сумма элементов массива типа int = "; cout << sumElements(ArrInt, Size); cout << endl << endl; cout << "Сумма элементов массива типа double = "; cout << sumElements(ArrDouble, Size); cout << endl << endl; cout << "Сумма элементов обоих массивов = "; cout << sumElements(ArrInt, ArrDouble, Size); cout << endl << endl; return 0; } int sumElements(int arrI[], int size) { int sumElArr = 0; for (int i = 0; i < size; i++) { sumElArr += arrI[i]; } return sumElArr; } double sumElements(double arrD[], int size) { double sumElArr = 0; for (int i = 0; i < size; i++) { sumElArr += arrD[i]; } return sumElArr; } double sumElements(int arrI[], double arrD[], int size) { double sumElArr = 0; for (int i = 0; i < size; i++) { sumElArr += arrI[i]; sumElArr += arrD[i]; } return sumElArr; } |
Определения перегруженных функций находятся в строках 31 – 61. В них создается переменная для накопления суммы значений элементов массива. В цикле for сумма накапливается. Далее полученное значение возвращается в программу, на место вызова перегруженной функции.
Обращение ко всем трём функциям производится по одному и тому-же имени – строки 17, 21, 25. Передав в функцию при вызове массив типа int и его размер, компилятор сам автоматически определит, какую из трёх перегруженных функций ему необходимо использовать. Точно так же произойдет и во время вызова остальных функций.
Самую важную роль в перегруженных функциях играет именно список параметров. Его называют ещё сигнатурой функции. Чтобы пользоваться перегруженными функциями их сигнатура обязательно должна быть разной. Иначе компилятор не сможет определить, какую именно функцию необходимо использовать в том или ином случае. То есть в сигнатурах параметры должны отличаться количеством, типами или и тем и вторым.
Как делать не надо:
При таком объявлении, даже с тем учетом, что функции возвращают данные с разными типами, и что имена параметров отличаются, компилятор не сможет определить какую из двух функций вызвать. Их сигнатуры одинаковы по типам и по количеству параметров. Поэтому такие функции не могут быть перегруженными.
Посмотрите короткое видео о перегрузке: