Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

В объектно-ориентированном программировании , функция друг , который является «другом» данного класса , это функция , которая получает такой же доступ , как методы для частных и защищенных данных .[1]

Дружественная функция объявляется классом, предоставляющим доступ, поэтому дружественные функции являются частью интерфейса класса, как и методы. Дружественные функции позволяют использовать объекты в альтернативном синтаксисе, например, f(x)вместо x.f()или g(x,y)вместо x.g(y). Дружественные функции имеют такое же значение для инкапсуляции, как и методы.

Похожая концепция - это класс друзей .

Сценарии использования [ править ]

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

  • функция глобальной или пространственной области видимости может быть объявлена ​​как друг обоих классов
  • функция-член одного класса может быть объявлена ​​другом другого класса.
#include  <iostream>используя  пространство имен  std ; class  Foo ;  // Вперед объявление класса Foo, например, для компиляции. class  Bar  {  частный :  int  a  =  0 ;  public :  void  show ( Bar &  x ,  Foo &  y );  Друг  аннулируются  шоу ( Bar &  х ,  Foo &  у );  // объявление глобального друга }; класс  Foo  {  частный :  int  b  =  6 ;  общественности :  друг  аннулируются  шоу ( Bar &  х ,  Foo &  у );  // объявление глобального друга  друга  void  Bar :: show ( Bar &  x ,  Foo &  y );  // объявление друга из другого класса }; // Определение функции-члена Bar; этот член является другом Foo void  Bar :: show ( Bar &  x ,  Foo &  y )  {  cout  <<  "Показать через функциональный член Bar"  <<  endl ;  cout  <<  "Bar :: a ="  <<  x . a  <<  endl ;  cout  <<  "Foo :: b ="  <<  y . b  <<  endl ; } // Друг для Bar и Foo, определение глобальной функции void  show ( Bar &  x ,  Foo &  y )  {  cout  <<  "Показать через глобальную функцию"  <<  endl ;  cout  <<  "Bar :: a ="  <<  x . a  <<  endl ;  cout  <<  "Foo :: b ="  <<  y . b  <<  endl ; } int  main ()  {  Бар  a ;  Foo  b ;  показать ( а , б );  а . показать ( а , б ); }

Ссылки [ править ]

  1. ^ Holzner, Стивен (2001). C ++: Черная книга . Скоттсдейл, Аризона: Coriolis Group. п. 397. ISBN. 1-57610-777-9. Когда вы объявляете функцию другом класса, эта функция имеет доступ к внутренним элементам данных этого объекта (то есть его защищенным и закрытым членам данных).

Внешние ссылки [ править ]