ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 5) онлайн
Различные типы аргументов
В примере OVERLOAD мы создали несколько функций, имеющих одно и то же имя, но различное число аргументов. Аналогичным образом можно определить не- сколько функций с одинаковыми именами и одинаковым количеством аргумен- тов, но различными типами этих аргументов. Следующая программа, OVERENGL, использует перегруженную функцию для вывода расстояния в виде числа футов и числа дюймов. Аргументом функции может являться как структурная пере- менная типа Distance, так и обычная переменная типа float. В зависимости от ти- па аргумента, указанного при вызове, будет исполняться одна из двух функций.
// overengl.cpp
// демонстрирует перегруженные функции #include <iostream> using namespace std; //////////////////////////////////////////////////////////
struct Distance // длина в английской системе
{
int feet; float inches;
};
////////////////////////////////////////////////////////// void engldisp(Distance); // прототипы void engldisp(float); int main() {
Distance d1; // длина типа Distance
float d2; // длина типа float
// ввод значения d1
cout << "\nВведите число футов: "; cin >> d1.feet; cout << "Введите число дюймов: "; cin >> d1.inches; // ввод значения d2
cout << "Введите длину в дюймах: "; cin >> d2; cout << "\nd1 = ";
engldisp(d1); // вывод значения d1
cout << "\nd2 = ";
engldisp(d2); // вывод значения d2
cout << endl; return 0;
}
//-------- функция engldisp()----------------
void engldisp(Distance dd ) // параметр dd типа Distance {
cout <<dd.feet <<"\'-" << dd.inches <<"\""; }
//--------------------------------------------------------
//engldisp()
// вывод переменной типа float в футах и дюймах
void engldisp(float dd ) // параметр dd типа float {
int feet =static_cast<int>(dd /12); float inches = dd - feet*12;
cout <<feet <<"\'-" << inches <<"\""; }
Пользователю предлагается ввести два расстояния: первое — в виде отдельно вводимых количества футов и количества дюймов, а второе — в виде количества дюймов (например, 109,5 дюймов вместо 9'-1,5"). Программа вызывает перегру- женную функцию engldisp() для того, чтобы вывести первое значение, имеющее тип Distance(), и второе значение, имеющее тип float. Результат работы програм- мы выглядит следующим образом:
Введите число футов: 5 Введите число дюймов: 10.5 Введите расстояние в дюймах: 76.5 d1 = 5'-10.5" d2 = 6'-4.5"
Обратите внимание на то, что, несмотря на одинаковый результат работы различных версий функции engldisp(), код самих функций различен. Той из функ- ций, которая использует в качестве аргумента расстояние в дюймах, необходимо выполнить преобразование вещественного значения к типу int перед тем, как вывести результат на экран.
Использование перегруженных функций упрощает процесс разработки про- граммы, так как у программиста нет необходимости запоминать множество имен функций. Примером того, что в отсутствие перегрузки программа становится очень сложной, может служить вычисление абсолютной величины числа с по- мощью библиотечных функций C++. Поскольку эти библиотечные функции предназначены не только для C++, но и для C, не поддерживающего перегрузку, для каждого типа данных должна существовать своя функция, вычисляющая модуль. Так, для величин типа int существует функция abs(), для величин ком- плексного типа — функция cabs(), для величин типа double — функция fabs() и для величин типа long — функция labs(). С помощью перегрузки в C++ един- ственная функция с именем abs() обрабатывает значения всех указанных типов.
Как мы увидим позже, механизм перегрузки функций полезен при обработке различных типов объектов.
12 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
