Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Створення та використання дружніх функцій та класів

С++ надає можливість обійти одну із концепцій ООП – концепцію інкапсуляції- за допомогою друзів. С++ дозволяє об’являти два види друзів класу: дружню функцію та дружній клас.

Звичайний доступ до закритих членів класу – використання відкритої функції-члена. Але С++ підтримує інший спосіб одержання доступу до закритих членів класу – за допормогою дружніх функцій. Дружні функції не є членами класу, але тим не менше мають доступ до його закритих членів. Одна така функція може мати доступ до закритих членів декількох класів.

Функція не може стати другом класу “без його згоди”. Для одержання прав друга функція повинна бути описана в тілі класу.

Щоб оголосити функцію дружньою деякому класу, у визначення цього класу включають її прототип, перед яким ставиться ключове слово friend. Наведемо приклад оголошення дружньої функції деякому класу.

#include <iostream.h>

class myclass

{

int n, d;

public:

myclass(int n1, int d1)

{n=n1; d=d1;}

// оголошення дружньої фукції

friend bool isfactor(myclass ob);

};

// визначення дружньої фукції

bool isfactor (myclass ob)

{

if (ob.n % ob.d=0) return true;

else return false;

}

void main()

{

myclass ob(12,3);

if (isfactor (ob))

cout << “ 12 ділиться без остачі на 3 \n”;

else

cout << “ 12 не ділиться без остачі на 3 \n”;

}

Підкреслимо , що дружня функція не є членом класу, в якому вона оголошена. Тому, викликаючи дружню функцію, не потрібно вказувати ім’я об’єкта або вказівник на об’єкт і операцію доступу до члена класу (крапку або стрілку). Доступ до закритих членів класу дружня функція одержує тільки через об’єкт класу, який повинен бути оголошений всередині функції, або переданий її в якості аргумента. Дружня функція не наслідується, тобто вона не є такою для похідних класів. З іншої сторони, функція може бути дружньою зразу декільком класам.

Приклад оголошення дружньої функцій для двох класів.

#include <iostream.h>

class myclass1; //неповне оголошення класу

class myclass2

{

 

int d;

public:

myclass2 (int d1) { d=d1;}

// оголошення дружньої фукції

friend bool isfactor(myclass1 ob1, myclass2 ob2);

};

class myclass1

{

int n;

public:

myclass1 ( int n1) {n=n1;}

// оголошення дружньої фукції

friend bool isfactor(myclass1 ob1, myclass2 ob2);

};

// визначення дружньої фукції

bool isfactor (myclass1 ob1, myclass2 ob2)

{

if (ob1.n % ob2.d=0) return true;

else return false;

}

void main()

{

myclass1 ob1(12);

myclass2 ob2(3);

 

if (isfactor (ob1, ob2))

cout << “ 12 ділиться без остачі на 3 \n”;

else

cout << “ 12 не ділиться без остачі на 3 \n”;

}

 

Ця програма демонструє також важливий випадок застосування неповного оголошення класу: без застосування цієї конструкції в даному випадку було б неможливо оголосити дружню функцію для двох класів. Неповне оголошення класу myclass1 дає можливість використовувати його ім’я в оголошенні дружньої функції ще до його визначення.

Функція може бути членом одного класу і дружньою іншому.

Наприклад.

#include <iostream.h>

class myclass1; //неповне оголошення класу

 

class myclass2

{

 

int d;

public:

myclass2 (int d1) { d=d1;}

bool isfactor(myclass1 ob1);

};

class myclass1

{

int n;

public:

myclass1 ( int n1) {n=n1;}

// оголошення дружньої фукції

friend bool

myclass2 :: isfactor(myclass1 ob1);

};

// визначення дружньої фукції

bool myclass2 :: isfactor (myclass1 ob1)

{

if (ob1.n % d=0) return true;

else return false;

}

void main()

{

myclass1 ob1(12);

myclass2 ob2(3);

//isfactor () викликається як функція-член класу myclass2

if (ob2.isfactor (ob1))

cout << “ 12 ділиться без остачі на 3 \n”;

else

cout << “ 12 не ділиться без остачі на 3 \n”;

}

 

С++ дозволяє оголосити не лише дружню функцію, але і дружній клас, надавши йому повний доступ до членів свого класу. Для цього достатньо включити в оголошення класу ім’я іншого класу, оголошеним дружнім, перед яким ставиться ключове слово friend.

Наприклад.

class myclass

{

//…

friend class anotherclass;

}

Клас не може оголосити сам себе другом деякого іншого класу. Для того, щоб механізм дружності запрaцював, він повинен бути оголошеним дружнім в цьому іншому класі.

Два класа могуть оголосити один одного другами. З практичної точки зору така ситуація свідчить про погано продуману ієрархію класів, хоча мова С++ допускає таку можливість. В цьому випадку оголошення класів буде мати вигляд:

Class B; //неповне оголошення класу

 

Class A

{

friend class B;

//…

};

class B

{

friend class A;

//…

};

Неповне оголошення класу, яке наведене в даному фрагменті, може знадобитись, лише якщо в класі А є посилання на клас В, наприклад, в параметрі функції-члена.

По відношенню до дружніх класів діють наступні правила:

· Дружність не є взаємною властивістю: якщо А друг В, то не означає, що В – друг А;

· Дружність не наслідується: якщо В – друг А, то класи, що походять від В, не є дружніми із А;

· Дружність не переходить на нащадки базового класу: якщо В – друг А, то В не є другом для класів, похідних від А.


Читайте також:

  1. ACCESS. СТВОРЕННЯ ЗВІТІВ
  2. ACCESS. СТВОРЕННЯ ФОРМ
  3. А. Розрахунки з використанням дистанційного банкінгу.
  4. А. Створення власної папки.
  5. Автоматичне і ручне створення об’єктів.
  6. Адаптація законодавства України до законодавства ЄС - один із важливих інструментів створення в Україні нової правової системи та громадянського суспільства
  7. Адаптація законодавства України до законодавства ЄС - один із важливих інструментів створення в Україні нової правової системи та громадянського суспільства
  8. Аденогіпофіз, його гормони, механізм впливу, прояви гіпер- та гіпофункцій.
  9. АЛГОРИТМ СТВОРЕННЯ БРЕНДУ
  10. Алгоритм створення тренінгової програми
  11. Альтернативна вартість та її використання у проектному аналізі
  12. Аналіз використання капіталу.




Переглядів: 2253

<== попередня сторінка | наступна сторінка ==>
 | Абстрактні класи

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

  

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.02 сек.