
- •1 Вопрос: Поняття алгоритму. Властивості алгоритму. Способи описування алгоритмів
- •40 Вопрос
- •Создание простого конструктора
- •Представление о деструкторе
- •Что вам необходимо знать
- •41 Вопрос: ------
- •42 Вопрос: Урок 26. Наследование
- •Простое наследование
- •43 Вопрос 44 вопрос:
- •Дружні функції
- •46 Вопрос:
- •Первое знакомство с перегрузкой функций
- •Когда необходима перегрузка
- •Что вам необходимо знать
- •Создание простого шаблона функции
- •Шаблоны, которые используют несколько типов
- •Что вам необходимо знать
- •Шаблоны классов
- •16.1. Определение шаблона класса
- •50 Вопрос:
- •Класс cFile
- •Структуры
- •Класифікація мов програмування
- •Типы переменных. Объявление переменных. Константы. Присваивание. Арифметические операции. Инкремент и декремент.
43 Вопрос 44 вопрос:
Дружня функція – функція, яка описується в межах класу, але реалізація її знаходиться в іншому класі. При цьому вона має повний доступ до закритої частини класу. Дружні функції властиві далеко не для всіх мов програмування. Розглянемо приклад дружньої функції на мові С++:
//файл Square.h #pragmaonce #include“Point.h“ #include<iostream> using namespace std; /** @classSquare Клас – абстракція квадрата */ classSquare { private: /// Координатилівоговерхнього кута квадрата Point *top_left; /// Довжинасторони квадрата doubleside_length; public: /// Конструкторзазамовчанням Square(void); /// Конструктор з параметрами /// @param_top_left – координатилівоговерхнього кута квадрата /// @param_side_length – довжинасторони квадрата Square(Point *_top_left, double _side_length); /// Метод – обчисленняплощі квадрата /// @return - повертаєзначенняплощі, представленедробовим числом doublearea_of_square(); /// Метод - обчислення периметра квадрата /// @return - повертаєзначення периметра, представленедробовим числом doubleperimeter(); /// Дружняфункція – виведенняданих про квадрат /// @param it – посиланняобєкткласу friend void show(Square *_it); /// Деструктор ~Square(void); }; |
//Файл friend_funktion.h #include“Square.h“ #include<iostream> using namespace std; void show(Square *_it) { cout<<“Information about square:”<<endl; cout<<“A(“<<_it->top_left->get_x()<<“; “<<_it->top_left->get_y()<<“)”<<endl; cout<<“B(“<<_it->top_left->get_x() + _it->side_length<<“; “<<_it->top_left->get_y()<<“)”<<endl; cout<<“C(“<<_it->top_left->get_x() + _it->side_length<<“; “<<_it->top_left->get_y() – _it->side_length<<“)”<<endl; cout<<“D(“<<_it->top_left->get_x()<<“; “<<_it->top_left->get_y() – _it->side_length<<“)”<<endl; } |
Отже опис дружньої функції починається із ключового слова friend, далі вказується тип даних який повертається, назва функції, список параметрів в дужках. Зазвичай для отримання доступу до закритих даних об’єкта в списку параметрів вказується посилання на поточний об’єкт, як у прикладі.
Одною із цілей використання дружньої функції є опис бінарних операторів для класів.
Дружні функції
Клас може надавати особливі привілеї певним зовнішнім функціям або функціям-членам іншого класу. Ці функції одержали назви дружніх. Якщо функція або клас оголошена як дружні даному класу, то такі функції або функції-члени такого класу можуть здійснювати безпосередній доступ до всіх полів класу, для якого вони дружні. Дружні функції і класи можуть здійснювати прямий доступ до закритих полів класу без використання функцій-членів цього класу.
Ключове слово friend - специфікатор функції, який дає функциі- не члену класу доступ до прихованих членів класу. Він використовується для того, щоб вийти за строгі рамки типізації і заховання даних в С++.
Одна з причин їх використання полягає втом, що деякі функції потребують привілейованого доступу більш, чим до одного класу. Друга причина - friend-функція передає всі параметри через список параметрів, і значення кожного з них підлегло перетворенню, сумісному з призначенням. Такі перетворення застосовуються до явно переданих аргументів-класів і тому особливо корисні у випадках перевантаження оператора.
Оголошення friend функції повинне з'являтися усередині оголошення класу, якому вона дружня. Імені функції передує ключове слово friend, і її оголошення може знаходиться як в public так і в private частини класу, що не вплине на значення. Функція-член одного класу може бути friend-функцією іншого класу. Це відбувається тоді, коли функція-член оголошена в friend класі з використанням оператора дозволу контексту для визначення імені функції дружнього класу. Якщо всі функції-члени одного класу є friend-функціями іншого класу, то це можна визначити записом:
friend class ім'якласу
class t1
{
friend void а(); // friend-функція
int b(); // функція-член
};
class t2
{
friend int t1::b();
// функція-членкласу t1 маєдоступдовсіхприхованихполівкласу t2
};
class t3
{
friend class t1;
// всіфункції-членикласу t1 маютьдоступдовсіхполівкласу t3
};
Розглянемо клас matrix і клас vector. Функція множення вектора на матрицю повинна мати доступ до private-членів обох класів. Ця функція буде friend для обох класів.
class matix;
class vect
{
int *p;
int size;
friend vect mpy(const vect &,const matix &);
public:
};
class matrix
{
int **base;
int row,column;
friend vect mpy(constr vect&,const matirx &);
};
vect mpy(const vect &v,const matrix &m)
{
if(v.size!=m.row) { exit(1); }
vect ans(column);
//.....
return ans;
}
Другорядне значення вимагає попереднього опису класу matrix. Воно необхідне тому, що функція mpy повинна з'являтися в обох класах, і використовує кожен клас як тип аргументу.
Friend-функції можна розглядати як частину загального інтерфейсу класу. Існує ряд ситуацій, в яких вони можуть бути альтернативою функціям-членам. Використання freind-функцій спірне, тому що вони порушують інкапсуляцію, що оточує private члени класів. Парадигма ООП стверджує, що об'єкти (у С++ вони - змінні класу) доступні їх public члени. Тільки функції-члени повинні мати доступ до прихованої реалізації АТД. Це ясний і строгий принцип проектування. Friend-функція знаходиться на сама його межі, оскільки має доступ до private членам, сама не будучи функцією-членом. З її допомогою можна організувати швидкий код для доступу до подробиць реалізації класу.
45 поняття віртуальної функції в с++
Віртуальні функції-ф-ї які компоненти класів.Вони оголошуються в похідних класах |
перевизначена ф-я в похідному класі наз. заміщеною ф-ією |
може бути оголошено декілька віртуальних ф-й |
при необхідності вони можуть мати різні рівні доступу |
|
Віртуальні ф-ї не можуть бути статичними компонентами класу |
не можуть бути дружніми ф-ями |
клас що містить віртуальну ф-ю наз. Поліморфним |
якщо вірт. ф-ія не заміщується в породженому класі то викликається її версія з базового классу, |
однак в багатьох випадках неможливо створити ефективну версію в базовому класі яка б відповідала б умовам всіх похідних класів. |
|
|
крім того треба гарантувати що віртю ф-я буде заміщена у всіх похідних класах,для цих випадків передбачені чисто віртуальні функції. Virtual тип ім'я ф-її (параметри)=0. |