МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів
Контакти
Тлумачний словник Авто Автоматизація Архітектура Астрономія Аудит Біологія Будівництво Бухгалтерія Винахідництво Виробництво Військова справа Генетика Географія Геологія Господарство Держава Дім Екологія Економетрика Економіка Електроніка Журналістика та ЗМІ Зв'язок Іноземні мови Інформатика Історія Комп'ютери Креслення Кулінарія Культура Лексикологія Література Логіка Маркетинг Математика Машинобудування Медицина Менеджмент Метали і Зварювання Механіка Мистецтво Музика Населення Освіта Охорона безпеки життя Охорона Праці Педагогіка Політика Право Програмування Промисловість Психологія Радіо Регилия Соціологія Спорт Стандартизація Технології Торгівля Туризм Фізика Фізіологія Філософія Фінанси Хімія Юриспунденкция |
|
|||||||
Створення та використання дружніх функцій та класівС++ надає можливість обійти одну із концепцій ООП – концепцію інкапсуляції- за допомогою друзів. С++ дозволяє об’являти два види друзів класу: дружню функцію та дружній клас. Звичайний доступ до закритих членів класу – використання відкритої функції-члена. Але С++ підтримує інший спосіб одержання доступу до закритих членів класу – за допормогою дружніх функцій. Дружні функції не є членами класу, але тим не менше мають доступ до його закритих членів. Одна така функція може мати доступ до закритих членів декількох класів. Функція не може стати другом класу “без його згоди”. Для одержання прав друга функція повинна бути описана в тілі класу. Щоб оголосити функцію дружньою деякому класу, у визначення цього класу включають її прототип, перед яким ставиться ключове слово 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; //… }; Неповне оголошення класу, яке наведене в даному фрагменті, може знадобитись, лише якщо в класі А є посилання на клас В, наприклад, в параметрі функції-члена. По відношенню до дружніх класів діють наступні правила: · Дружність не є взаємною властивістю: якщо А друг В, то не означає, що В – друг А; · Дружність не наслідується: якщо В – друг А, то класи, що походять від В, не є дружніми із А; · Дружність не переходить на нащадки базового класу: якщо В – друг А, то В не є другом для класів, похідних від А. Читайте також:
|
||||||||
|