Функция друга
В объектно-ориентированном программировании дружественная функция , то есть «друг» данного класса , — это функция, которой предоставляется такой же доступ, как и методам, к частным и защищенным данным . [1]
Дружественная функция объявляется классом, предоставляющим доступ, поэтому дружественные функции являются частью интерфейса класса, как и методы. Дружественные функции позволяют альтернативному синтаксису использовать объекты, например f(x)
вместо x.f()
, или g(x,y)
вместо x.g(y)
. Дружественные функции имеют те же последствия для инкапсуляции, что и методы.
Похожая концепция – это класс друзей .
Варианты использования
[ редактировать ]Этот подход можно использовать в дружественной функции, когда функции необходимо получить доступ к частным данным в объектах из двух разных классов. Это можно сделать двумя схожими способами:
- Функция глобальной области или области имен может быть объявлена как дружественная для обоих классов.
- Функция-член одного класса может быть объявлена как дружественная другому.
// C++ implementation of friend functions.
#include <iostream>
using namespace std;
class Foo; // Forward declaration of class Foo in order for example to compile.
class Bar {
private:
int a = 0;
public:
void show(Bar& x, Foo& y);
friend void show(Bar& x, Foo& y); // declaration of global friend
};
class Foo {
private:
int b = 6;
public:
friend void show(Bar& x, Foo& y); // declaration of global friend
friend void Bar::show(Bar& x, Foo& y); // declaration of friend from other class
};
// Definition of a member function of Bar; this member is a friend of Foo
void Bar::show(Bar& x, Foo& y) {
cout << "Show via function member of Bar" << endl;
cout << "Bar::a = " << x.a << endl;
cout << "Foo::b = " << y.b << endl;
}
// Friend for Bar and Foo, definition of global function
void show(Bar& x, Foo& y) {
cout << "Show via global function" << endl;
cout << "Bar::a = " << x.a << endl;
cout << "Foo::b = " << y.b << endl;
}
int main() {
Bar a;
Foo b;
show(a,b);
a.show(a,b);
}
Ссылки
[ редактировать ]- ^ Хольцнер, Стивен (2001). С++: Черная книга . Скоттсдейл, Аризона: Группа Кориолиса. стр. 397. ИСБН 1-57610-777-9 .
Когда вы объявляете функцию другом класса, эта функция имеет доступ к внутренним членам данных этого объекта (то есть к его защищенным и закрытым членам данных).
Внешние ссылки
[ редактировать ]- Учебное пособие по дружественным функциям C++ на CoderSource.net