ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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() обрабатывает значения всех указанных типов.

Как мы увидим позже, механизм перегрузки функций полезен при обработке различных типов объектов.

 

25