Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АМП S.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
107.91 Кб
Скачать

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.