Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6_ПРАКТИЧНЕ ЗАНЯТТЯ №6 -Дружні оператор функції...doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
75.78 Кб
Скачать

Практичне заняття №6

Тема: Дружні оператор- функції . Перевантаження введення у поток та виведення із потоку (cin>> cout <<)

Мета : навчититись перевантажувати введення у поток та виведення із потоку (cin>> cout <<)

Обладнання: Персональні комп’ютери

Теоретичні відомості

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

//Приклад використання дружньої функції

#include <iostream>

#include <windows.h>

using namespace std;

class myclass {

int n, d;

public:

myclass (int i, int j) { n = i; d = j; }

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

friend int isfactor (myclass ob) ;

};

/* Тут представлено визначення дружньої функції. Вона повертає істину, якщо n ділиться без залишку на d. Відзначте, що ключове слово friend у визначенні функції isfactor () не

використовується.*/

int isfactor (myclass ob)

{

if(!(ob.n % ob.d)) return 1;

else return 0;

}

void main()

{

int x1, y1;

cin >> x1 >> y1;

myclass ob1 (x1 , y1);

if (isfactor (ob1))

cout << x1 << " without remainder divisible by " << y1 << endl;

else

cout << x1 << " without remainder is not divisible by " << y1 << endl;

system ("pause");

}

Функція може бути дружньою відразу для декількох класів. У наступному прикладі демонструється

приклад використання дружньої функції для декількох кількох класів.

#include <iostream>

#include <windows.h>

using namespace std;

class truck; // попереднє оголошення

class car {

int passengers;

int speed;

public:

car(int p, int s) { passengers = p; speed = s; }

friend int sp_greater(car c, truck t);

};

class truck {

int weight;

int speed;

public:

truck(int w, int s) { weight = w; speed = s; }

friend int sp_greater(car c, truck t);

};

/*Повертає додатнє число, якщо легкова машина швидше вантажівки.Повертає 0 при однакових швидкостях.Повертає від'ємне число, якщо вантажівка швидше легкової машини. */

int sp_greater(car c, truck t)

{

return c.speed - t.speed;

}

void main()

{

int t;

car c1(6, 55), c2 (2, 120);

truck t1(10000, 55), t2(20000, 72);

cout << "порівняння значень c1 и t1:\n";

t = sp_greater(c1, t1);

if(t<0) cout << "вантажівка швидше. \n";

else if(t==0) cout << "Швидкості машин однакові.\n";

else cout << "Легкова машина швидше. \n";

cout << "\n Порівняння значень c2 и t2:\n";

t = sp_greater(c2, t2);

if(t<0) cout << "Грузовик швидше . \n";

else if(t==0) cout << ""Швидкості машин однакові \n";

else cout << "Легкова машина швидше \n";

system ("pause");

}/====Приклад превантаження оператора виведення із потоку (cout <<)======

#include <iostream>

using namespace std;

class A

{ int m_iSize;

int *m_pAr;

public:

A(int iSize);

friend ostream & operator << (ostream & out, const A & aRigth);

~A();

};

A::A(int iSize):m_iSize(iSize),m_pAr(new int [iSize])

{

for (int i = 0; i < m_iSize; ++i)

m_pAr[i]=rand()%21;

}

ostream & operator << (ostream & out, const A & aRigth)

{

cout << "quantity elements " ;

out << aRigth.m_iSize;

cout << endl << "Massiv:";

for ( int i = 0; i< aRigth.m_iSize; ++i)

out << aRigth.m_pAr[i] << " ";

return out;

}

A::~A()

{

delete [] m_pAr;

}

int main()

{

A a1(5), a2(8);

cout << a1 << endl;

cout << a2 << endl;

system ("pause");

return 0;

}