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