В объектно-ориентированном программировании , функция друг , который является «другом» данного класса , это функция , которая получает такой же доступ , как методы для частных и защищенных данных .[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 ; показать ( а , б ); а . показать ( а , б ); }
Ссылки [ править ]
- ^ Holzner, Стивен (2001). C ++: Черная книга . Скоттсдейл, Аризона: Coriolis Group. п. 397. ISBN. 1-57610-777-9.
Когда вы объявляете функцию другом класса, эта функция имеет доступ к внутренним элементам данных этого объекта (то есть его защищенным и закрытым членам данных).
Внешние ссылки [ править ]
- Учебник по функциям друга C ++ на CoderSource.net
- Учебник по дружбе и наследованию C ++ на cplusplus.com