Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 34; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.220.196.68 (0.009 с.) |