Дружні функції (методи) в с

У цій статті ми розповімо про наступне:

  • Що таке дружні функції і, головне, навіщо вони потрібні.
  • Чим відрізняються звичайні методи класу від дружніх функцій класу.
  • Як оголошувати і визначати наші дружні функції.
  • Як викликати дружні функції з головною main () функції.

Найважливішим, а й, швидше за все, самим незрозумілим для вас зараз стане визначення дружньої функції.

Дружня функція - це функція, яка не є членом класу, але має доступ до членів класу, оголошеним в полях private або protected.

Довго не вникати в суть цього визначення, а краще відразу переходите до наступного абзацу. Обіцяю, що після прочитання статті ви повернетеся до цього визначення і вас відвідає думка: «Ну так - так і є! Тут все зрозуміло! »

using namespace std;

name = new char [20];

cout <<". Деструктор. " <

friend void getData (Woman25);

>; // Закінчилося визначення класу Woman25

void setData (char * n, int w, Woman25 object) // визначаємо friend-функцію setData

void getData (Woman25 object) // визначаємо friend-функцію getData

cout <

void Woman25 :: setData (char * n, int w) / / визначаємо set-метод класу

void Woman25 :: getData () // визначаємо get-метод класу

cout <

void Woman25 :: advise () // визначаємо метод класу Рада (advise)

if (weight <55)

cout <<"Вам надо потреблять больше калорий!" <

> Else if (weight> = 55 weight <= 65)

cout <<"Ваш вес в норме!" <

cout <<"Вам надо ограничивать себя в еде!" <

Woman25 Norm; // створюємо об'єкт Norm, спрацює конструктор і weight буде = 60, name - Норма

Norm.getData (); // виклик методу класу

Woman25 Anna; // Другий об'єкт

Anna.setData ( "Анна", 100); // Виклик методу класу

Anna.getData (); // Виклик методу класу

Anna.advise (); // Виклик методу класу

Woman25 Inna; // Третій об'єкт

setData ( "Інна", 50, Inna); // Виклик дружньої функції

getData (Inna); // Виклик дружньої функції

Inna.advise (); // Виклик методу класу

Тепер починається, мабуть, найцікавіше - визначення поза класом наших дружніх функцій і звичайних методів класу. Все це розташовується в рядках 32 - 66. Дивіться, коли ми визначаємо наші дружні функції. рядки 32 - 36 і 38 - 41. ми не використовуємо оператор. подвійна двокрапка (область видимості методу). Це вже говорить нам про те, що дружня функція не належить класу, не є його компонентом. А при визначенні інших методів використання оператора. є обов'язковим. Метод класу advise (). на підставі отриманих даних про вагу, дає користувачеві один з рад або повідомляє, що вага в нормі.

Переходимо в головну функцію - рядки 68 - 87. Тут ми створюємо об'єкт класу Woman25 Norm ;. при створенні якого спрацює конструктор і ініціалізує елементи name і weight. Викликаємо метод класу Norm.getData (); щоб вивести на екран значення норми. З другим створеним об'єктом Woman25 Anna; працюємо, викликаючи звичайні set і get - методи класу, а з третім об'єктом Woman25 Inna; - викликаючи дружні функції. Як бачите, викликаються вони як функції, які не належать класу. Об'єкт класу ми передаємо, як параметр.

Запускаємо програму і бачимо наступне:

Деструкція.
. Деструкція.
. Деструкція.

Для продовження натисніть будь-яку клавішу.

Тепер, як завжди, трохи теорії, для закріплення матеріалу:

  • Дружня функція може розташовуватися в будь-якому полі класу - private. public або protected. Вона при будь-яких обставинах буде мати доступ до private-елементів класу і, навіть якщо вона сама знаходиться в полі private (як в нашому прикладі), до неї можна буде звернутися поза класом, не використовуючи спеціальних методів.
  • Коли ми визначаємо дружню функцію, елементи класу необхідно явно передавати в неї у вигляді параметрів функції. Так як вона не є компонентом класу, вона не отримує покажчик this.
  • У вигляді параметра, в дружню функцію так само треба передати покажчик або посилання на об'єкт класу. Інакше вона не побачить дані якого класу їй прийняти і обробити.
  • Функція може використовуватися, як дружня до декількох класів.
  • Викликаються дружні функції, як звичайні функції. Тобто не використовується такий спосіб - Об'ект_класса.функція (). Після внесення всіх необхідних параметрів в неї при виклику, вона сама побачить з елементами якого класу і об'єкту треба працювати.

Ось і все для початку.

Схожі статті