На этом шаге мы приведем пример использования дружественных функций.
Использование механизма дружественных функций позволяет упростить интерфейс между классами. Например, дружественная функция позволит получить доступ к собственным или защищенным компонентам сразу нескольких классов. Тем самым из классов можно иногда убрать компонентные функции, предназначенные только для доступа к этим "скрытым" компонентам.
В качестве примера рассмотрим дружественную функцию двух классов "точка на плоскости" и "прямая на плоскости". Класс "точка на плоскости" включает компонентные данные для задания координат (х, у) точки. Компонентными данными класса "прямая на плоскости" будут коэффициенты A, B, C общего уравнения прямой A*х+B*y+C = 0. Дружественная функция определяет уклонение заданной точки от заданной прямой. Если (a, b) - координаты конкретной точки, то для прямой, в уравнение которой входят коэффициенты A, B, C, уклонение вычисляется как значение выражения A*a+B*b+C. В следующей программе определены классы с общей дружественной функцией, в основной программе введены объекты этих классов и вычислено уклонение от точки до прямой:
//OOP14_1.СРР - классы с общей дружественной функцией. #include <iostream.h> class line2; // Предварительное описание. // Класс "точка на плоскости": class point2 { float x, y; // Координаты точки на плоскости. public: point2(float xn = 0, float yn = 0) // Конструктор. { x = xn; y = yn; } friend float uclon(point2,line2); }; // Класс "прямая на плоскости": class line2 { float A, B, C; // Параметры прямой. public: line2(float a, float b, float c) // Конструктор. { A = a; B = b; C = c; } friend float uclon(point2,line2); }; // Внешнее определение дружественной функции. float uclon(point2 p, line2 l) { return l.A * p.x + l.B * p.y + l.C; } void main(void) { point2 P(16.0,12.3); // Определение точки P. line2 L(10.0,-42.3,24.0); // Определение прямой L. cout << "\n Уклонение точки Р от прямой L: "; cout << uclon(P,L); }
Результат выполнения программы:
Уклонение точки Р от прямой L: -336.29
На следующем шаге мы продолжим знакомство с друзьями классов, в частности, рассмотрим дружественные классы.