Возможно, кого-то из новичков пугает название темы “Перегрузка функций”? Меня пугало. Казалось – це щось, з чим доведеться довго розбиратися. Насправді, перевантаження функцій дуже легко зрозуміти. Сложного нет ничего.
Перегруженные функции – это функции, которые имеют одинаковое имя, но отличаются количеством или типами принимаемых параметров. Либо – и тем и другим.
Для начала определимся в чём заключается суть использования перегруженных функций. Полягає вона в тому, что вы можете дать одинаковое имя функциям. При этом, вони можуть по-різному виконуватися і повертати значення різних типів.
Наприклад, функція повинна прийняти масив чисел і повернути в програму суму його елементів. Але ми можемо передати в функцію масив типу 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 и его размер, компилятор сам автоматически определит, какую из трёх перегруженных функций ему необходимо использовать. Точно так же відбудеться і під час виклику інших функцій.
Самую важную роль в перегруженных функциях играет именно список параметров. Його називають ще сигнатурою функції. Чтобы пользоваться перегруженными функциями их сигнатура обязательно должна быть разной. Иначе компилятор не сможет определить, какую именно функцию необходимо использовать в том или ином случае. То есть в сигнатурах параметры должны отличаться количеством, типами или и тем и вторым.
Как делать не надо:
При таком объявлении, даже с тем учетом, что функции возвращают данные с разными типами, и что имена параметров отличаются, компілятор не зможе визначити яку з двох функцій викликати. Их сигнатуры одинаковы по типам и по количеству параметров. Тому такі функції не можуть бути перевантаженими.
Посмотрите короткое видео о перегрузке: