
Практичне заняття №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;
}