Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Приклад використання дружніх функційСодержание книги
Поиск на нашем сайте
Все-таки інколи дружні функції занадто зручні, щоб від них відмовлятися. Найзагальнішим прикладом цього є ситуація, коли вони використовуються для підвищення багатосторонності перезавантажуваних операцій. Програма 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; просмотров: 77; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.39 (0.007 с.) |