Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

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

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 34; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.220.196.68 (0.009 с.)