ДРУЖНІ ФУНКЦІЇ ___________________________________________________________ 1
Функції, дружні одного класу ____________________________________________________ 1 Функції, дружні декільком класу ________________________________________________ 3 Функції-члени, дружні іншого класу _____________________________________________ 4
ДРУЖНІ КЛАСИ ____________________________________________________________ 5
Скажи мені хто твій друг, і я скажу, хто має доступ до твоїх закритих даних.
Концепція інкапсуляції даних - одна з основних концепцій ООП. C ++ надає можливість обійти цю концепцію за допомогою дружніх функцій. Однак використовувати її без вагомих причин не варто. C ++ дозволяє оголошувати два види друзів класу: дружню функцію або дружній клас.
Функції, дружні одного класу
Звичайний спосіб доступу до закритих членів класу - використання відкритої функції-члена. Однак C ++ підтримує і інший спосіб отримання доступу до закритих членів класу - за допомогою дружніх функцій. Дружні функції не є членами класу, але мають доступ до його закритим членам. Більш того, одна така функція може мати доступ до закритих членам декількох класів.
Щоб оголосити функцію дружній деякого класу, в визначення цього класу включають її прототип, перед яким ставиться ключове слово friend. Наведемо приклад:
// виводить на екран ім'я і координати поточної точки void Print () const;
// повертає значення відстані між поточною і заданої точками double Dist (Dot B) const;
// повертає значення відстані між двома заданими точками
friend double Dist (const Dot A. const Dot B);
// повертає значення відстані між двома заданими точками
double Dist (Dot * pA. Dot * pB); // функція отримує покажчики на точки // повертає значення площі трикутника з заданими вершинами
double Area (const Dot A. const Dot B. const Dot C);
double Dot. Dist (Dot B) const
файл Dot.cpp
Dot A ( 'A', 3. 4). B ( 'B', -3. 4); Dot C ( 'C');
CharToOem ( "Довжина відрізка", S);
cout<
У наведеному прикладі оголошений клас точки Dot і вирішується завдання обчислення відстані між двома точками. Завдання вирішена трьома різними способами.
Функція double Dot. Dist (Dot B) const є членом класу Dot і повертає значення відстані між поточною і заданої точками. Специфікатор const вказує компілятору, що стан поточного об'єкта не повинна змінюватися. Як параметр функція отримує цілком об'єкт типу Dot. який займає в пам'яті 17 байт. Функція-член класу викликається оператором: A. Dist (B). де об'єкт А є поточним, а об'єкт В - параметром.
Функція friend double Dist (const Dot A. const Dot B) повертає значення відстані між двома заданими точками. Специфікатор const перед параметрами вказує компілятору, що стан параметрів не повинно змінюватися. Як параметри функція одержує два посилання на об'єкти типу Dot. які займає в пам'яті по 4 байта кожен. Функція викликається оператором Dist (A. B). Оскільки функція є дружньою класу Dot. то доступ до закритих членам x і y параметрів A і B. які є об'єктами типу Dot. здійснюється за допомогою оператора точка, наприклад:
Використання покажчиків і посилань на об'єкти в якості параметрів функції замість об'єктів зменшує обсяг пам'яті, що резервується функцією, і час її виклику.
Наведений вище приклад містить також рішення задачі обчислення площі трикутника за допомогою глобальної функції double Area (const Dot A. const Dot B. const Dot C), яка по-
лучает три посилання на точки і повертає значення площі трикутника. Функція викликається операто-