Дружественные функции класса определяются вне области действия этого класса, но имеют право доступа к закрытым элементам private (и к элементам protected) данного класса.
Правила описания и особенности дружественных функций:
- дружественная функция объявляется внутри класса, к элементам которого ей нужен доступ, с ключевым слово friend. В качестве параметра ей должен передаваться объект, ссылка или указатель на объект класса, поскольку указатель this ей не передается.
- дружественная функция может быть обычной функцией или методом ранее определенного класса. На нее не распространяется действие спецификаторов доступа, место размещения ее объявления в классе безразлично.
- одна функция может быть дружественной сразу нескольким классам.
Использование механизма дружественных функций позволяет упростить интерфейс между классами. Например, дружественная функция позволит получить доступ к собственным или защищенным данным и методам сразу нескольких классов. Тем самым из классов можно иногда убрать методы, предназначенные только для доступа к этим "скрытым" полям данных и методам.
|
|
Рассмотрим пример: программа демонстрирует объявление и использование дружественной функции setX для установки закрытого элемента класса ClassOne.
//Листинг 16.1
#include<iostream>
using namespace std;
class ClassOne{
int x; //элемент данных
friend void setX(ClassOne &,int); //объявление друга
public:
ClassOne() {x=0;} //конструктор
void print() const {cout<<x<<"\n";} //вывод
};
//Можно изменять закрытую переменную класса ClassOne, так как setX //объявлена как дружественная функция класса ClassOne
void setX(ClassOne &c, int val)
{c.x=val; } //разрешено,т.к. setX - друг ClassOne
int main()
{ ClassOne object;
object.print();
setX(object,8); //задание x другом
object.print();
return 0;
}
Результаты выполнения программы:
Перегрузка операций
С++ позволяет переопределить действие большинства операций так, чтобы при использовании с объектами конкретного класса они выполняли заданные функции.
Формат определения функции-операции: