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

Все-таки інколи дружні функції занадто зручні, щоб від них відмовлятися. Найзагальнішим прикладом цього є ситуація, коли вони використовуються для підвищення багатосторонності перезавантажуваних операцій. Програма 22.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;

}

Програма 22.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;

Такий вираз є цілком коректним, але неелегантним і неочевидним. Як написати звичний для нас вираз, що містив би потрібні типи справа і зліва від оператора? За допомогою дружньої функції. Програма 22.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;

}

Програма 22.10

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

friend Distance operator+(Distance,Distance);

};

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

Distance operator+(Distance d1,Distance d2)

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

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

 








Дата добавления: 2015-08-26; просмотров: 595;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.007 сек.