Jump to content

Функция друга

В объектно-ориентированном программировании дружественная функция , то есть «друг» данного класса , — это функция, которой предоставляется такой же доступ, как и методам, к частным и защищенным данным . [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);
}
  1. ^ Хольцнер, Стивен (2001). С++: Черная книга . Скоттсдейл, Аризона: Группа Кориолиса. стр. 397. ИСБН  1-57610-777-9 . Когда вы объявляете функцию другом класса, эта функция имеет доступ к внутренним членам данных этого объекта (то есть к его защищенным и закрытым членам данных).
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: fc4f4d875265eb7bf02bca85f16f80e4__1699098480
URL1:https://arc.ask3.ru/arc/aa/fc/e4/fc4f4d875265eb7bf02bca85f16f80e4.html
Заголовок, (Title) документа по адресу, URL1:
Friend function - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)