русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Приклад використання дружніх функцій


Дата додавання: 2014-04-22; переглядів: 1001.


Все-таки інколи дружні функції занадто зручні, щоб від них відмовлятися. Найзагальнішим прикладом цього є ситуація, коли вони використовуються для підвищення багатосторонності перезавантажуваних операцій. Програма 13.9 показує обмеженість використання таких операторів без використання дружніх функцій. Програма працює з раніше вже нами використовуваним типом Distance (англійські міри довжини).

#include<iostream.h>

#include<conio.h>

#include<stdio.h>

#include<bios.h>

class Distance

{int feet;

float inches;

public:

Distance():feet(0),inches(0.0)

{}

Distance(float fltfeet)

{feet=(int)fltfeet;

inches=12*(fltfeet-feet);

}

Distance(int ft,float in)

{feet=ft;inches=in;}

void showdist()

{cout<<feet<<"\'-"<<inches<<'\'';}

Distance operator+(Distance);

};

//////////////

Distance Distance::operator+(Distance d2)

{int f=feet+d2.feet;

float i=inches+d2.inches;

if(i>=12.0)

{i-=12.0;f++;}

return Distance(f,i);

}

//////////////

int main()

{clrscr();

Distance d1=2.5;

Distance d2=1.25;

Distance d3;

cout<<"\nd1=";d1.showdist();

cout<<"\nd2=";d2.showdist();

d3=d1+10.0;

cout<<"\nd3=";d3.showdist();

// d3=10.0+d1;

// cout<<"\nd3=";d3.showdist();

cout<<endl;

bioskey(0);

return 0;

}

Програма 13.9

 

В цій програмі оператор «+» перевстановлений на додавання двох об’єктів типу Distance. Крім того, наявний конструктор з одним аргументом, який переводить значення типу float в значення типу Distance.

Якщо є такий конструктор, то можна записати вираз:

d3=10.0+d1;

Перезавантаженому + потрібні об’єкти типу Distance справа і зліва, але, знайшовши справа аргумент типу float, у відповідності з конструктором він переводить цей float в Distance і здійснює додавання.

Але що трапиться, коли ми переставимо доданки місцями?

d3=10.0+d1;

Цей вираз не буде оброблений як належить, оскільки об’єкт, чиїм методом є перезавантажений +, повинен бути змінною, що знаходиться зліва від оператора. Коли ми поміщаємо туди операнд іншого типу чи константу, компілятор використає + для додавання з цим типом (в даному випадку float) замість того, щоб додавати об’єкти типу Distance. Але цей оператор не вміє конвертувати float в Distance, тому не може виконати додавання. Вийти з цієї ситуації можна, створивши новий об’єкт типу Distance.

d3=Distance(10.)+d1;

Такий вираз є цілком коректним, але неелегантним і неочевидним. Як написати звичний для нас вираз, що містив би потрібні типи справа і зліва від оператора? За допомогою дружньої функції. Програма 13.10 демонструє, як саме це зробити.

#include<iostream.h>

#include<conio.h>

#include<stdio.h>

#include<bios.h>

class Distance

{int feet;

float inches;

public:

Distance():feet(0),inches(0.0)

{}

Distance(float fltfeet)

{feet=(int)fltfeet;

inches=12*(fltfeet-feet);

}

Distance(int ft,float in)

{feet=ft;inches=in;}

void showdist()

{cout<<feet<<”\’-“<<inches<<’\’’;}

friend Distance operator+(Distance,Distance);

};

//////////////

Distance operator+(Distance d1,Distance d2)

{int f=d1.feet+d2.feet;

float i=d1.inches+d2.inches;

if(i>=12.0)

{i-=12.0;f++;}

return Distance(f,i);

}

//////////////

int main()

{clrscr();

Distance d1=2.5;

Distance d2=1.25;

Distance d3;

cout<<”\nd1=”;d1.showdist();

cout<<”\nd2=”;d2.showdist();

d3=d1+10.0;

cout<<”\nd3=”;d3.showdist();

d3=10.0+d1;

cout<<”\nd3=”;d3.showdist();

cout<<endl;

bioskey(0);

return 0;

}

Програма 13.10

Перезавантажена операція + зроблена дружньою:

friend Distance operator+(Distance,Distance);

};

//////////////

Distance operator+(Distance d1,Distance d2)

Зверніть увагу, що у попередньому прикладі (програма 13.9) – перезавантажуваний + є методом, а в програмі 13.10 – дружньою функцією. Будучи звичайним методом, + оперував одним з доданків як об’єктом, членом якого він був, а другим – як операндом. Ставши дружньою функцією, + став розглядати обидва об’єкти в якості аргументів. З цієї причини змінні feet та inches з попередньої програми були замінені змінними d1.feet та d1.inches, оскільки цей об’єкт став аргументом.

Запам’ятаймо: щоб зробити функцію дружньою, її оголошення всередині класу слід починати з ключового слова friend. Визначення і виклик функції не змінюються.

 


<== попередня лекція | наступна лекція ==>
Int frifunc(alpha a,beta b) | Дружність і функціональний запис


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн