Перегрузка функций C++. Теория с примерами

Уровень сложности: 

Перегрузка функций C++ - это механизм, реализующий полиморфизм, при котором возможно использование одного имени функции для работы с операндами различных типов или с различным их количеством. То есть перегрузка функций позволяет обращаться к одному имени для решения схожих задач, но отличающихся по техническому исполнению.

Эта возможность языка C++ является одной из основополагающих, наряду с объектно-ориентированным программированием. Перегрузка функций позволяет упростить код программы и избавляет программиста от необходимости помнить названия разных функций для работы с переменными разных типов.

В языке C перегрузка функций не реализована, поэтому в языке C для нахождения модуля числа разработчику предлагаются три функции: abs() - для целых числе, labs() - для длинных целых, fabs() - для чисел с плавающей точкой двойной точности.

В C++ функции, которые имеют одинаковые имена и несколько реализаций, называются перегруженными функциями.

Также в C++ возможна перегрузка операторов (арифметических: сложения, вычитания, сравнения и т.д.; строковых: конкатенации; двоичных, присвоения и т.д.).

Следующие примеры программы на C++ демонстрирует перегрузку функции min(). В начале кода обозначены три заголовка этой функции: для целых чисел, чисел с плавающей точкой и строковых переменных.

Задача 1: предложить пользователю выбрать типы операндов, ввести их и найти минимальный операнд. Для чисел - показать минимальное число. Для строк - показывать самую короткую, для символов - показывать тот, который стоит первым в таблице символов.

Программа поиска минимального операнда
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int min(int a, int b);
  5. double min(double a, double b);
  6. string min(string a, string b);
  7.  
  8. int main()
  9. {
  10. int m, n;
  11. double a, b;
  12. string c, s;
  13. cout << "Программа выбор минимального\n";
  14. cout << "Выберите тип операндов: \n";
  15. cout << "1 - целые числа \n";
  16. cout << "2 - числа с плавающей точкой \n";
  17. cout << "3 - символы или строки\n";
  18. cin >> m;
  19. switch (m) {
  20. case 1:
  21. cout << "Введите два числа через пробел и нажмите Ввод:\n";
  22. cin >> m >> n;
  23. cout << "Минимальное: " << min(m,n);
  24. break;
  25. case 2:
  26. cout << "Введите два числа через пробел и нажмите Ввод:\n";
  27. cin >> a >> b;
  28. cout << "Минимальное: " << min(a,b);
  29. break;
  30. case 3:
  31. cout << "Введите два слова или два символа через пробел и нажмите Ввод:\n";
  32. cin >> c >> s;
  33. cout << "Минимум: " << min(c,s) << endl;
  34. break;
  35. }
  36. return 0;
  37. }
  38.  
  39. int min(int a, int b)
  40. {
  41. return a<b? a : b;
  42. }
  43.  
  44. double min(double a, double b)
  45. {
  46. return a<b? a : b;
  47. }
  48.  
  49. string min(string a, string b)
  50. {
  51. int c=a.length(), s=b.length();
  52. if (c < s) return a;
  53. //если длины одинаковые, то сравниваем номера символов в табице символов
  54. else if (c == s) return a < b ? a : b;
  55. else return b;
  56. }

 

Задача 2: Запросить ввод трёх чисел разных типов и вывести модуль каждого числа.

Программа вывода модулей чисел разных типов
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int abs(int a);
  6. double abs (double a);
  7. long abs (long a);
  8.  
  9. int main()
  10. {
  11. int a;
  12. double b;
  13. long c;
  14. cout << "Модуль числа" << endl;
  15. cout << "Введите целое: ";
  16. cin >> a;
  17. cout << "\nМодуль: " << abs(a);
  18.  
  19. cout << "\nВведите число двойной точности: ";
  20. cin >> b;
  21. cout << "\nМодуль: " << abs(b);
  22.  
  23. cout << "\nВведите число длинное: ";
  24. cin >> c;
  25. cout << "\nМодуль: " << abs(c);
  26.  
  27.  
  28. return 0;
  29. }
  30.  
  31.  
  32. int abs(int a) {
  33. return a<0 ? -a : a;
  34. }
  35. double abs (double a) {
  36. return a<0 ? -a : a;
  37. }
  38. long abs (long a) {
  39. return a<0 ? -a : a;
  40. }