68969

Перевантаження операторів. Дружні операторні функції

Лекция

Информатика, кибернетика и программирование

Перевантаження операторів за допомогою дружніх функцій Створення операторної функціїчлена З перевантаженням функцій тісно зв’язаний механізм перевантаження операторів. Операторні функції створюються за допомогою ключового слова opertor.

Украинкский

2014-09-28

31.5 KB

2 чел.

Лекція № 14

Тема: Перевантаження операторів. Дружні операторні функції.

План

1. Створення операторної функції-члена

2. Перевантаження операторів за допомогою дружніх функцій

Створення операторної функції-члена

З перевантаженням функцій тісно зв'язаний механізм перевантаження операторів. У мові C++ можна перенавантажувати більшість операторів, налаштувавши їх на конкретний клас. Наприклад, в класі, що підтримує стек, оператор "+" можна перевантажити для заштовхування елементів в стек, а оператор "-" — для виштовхування елементів. Перевантажений оператора зберігає своє первинне призначення. Просто набір типів, до яких його можна застосовувати, розширюється.

Перевантаження операторів — одна з найефективніших можливостей мови С++. Вона дозволяє повністю інтегрувати нові класи в існуюче програмне середовище. Після перевантаження операції над об'єктами нових класів виглядають точно так само, як операції над змінними вбудованих типів. Крім того, перевантаження операторів лежить в основі системи введення-висновку в мові C++.

Перевантаження операторів здійснюється за допомогою операторних функцій (operator function), які визначають дії перевантажених операторів застосовні до відповідного класу. Операторні функції створюються за допомогою ключового слова operator. Операторні функції можуть бути як членами класу, так і звичайними функціями. Проте звичайні операторні функції, як правило, об’являються дружніми по відношенню до класу, для якого вони перенавантажуються. У кожному з цих випадків операторна функція оголошується по-різному.

Операторна функція-член має наступний вигляд:

тип ім’я_класу: :operator# { список-аргументів)

{

...   //  Операції

}

Зазвичай операторна функція повертає об'єкт класу, з яким вона працює проте тип значення, що повертається, може бути будь-яким. Символ # замінюється необхідним оператором. Наприклад, якщо в класі перевантажується оператор ділення «/» операторна функція-член називається operator/. При перевантаженні унарного оператора список аргументів залишається порожнім. При перевантаженні бінарного оператора список аргументів містить один параметр. (Ці незвичайні правила ми роз'яснимо пізніше.)

#include <iostream.h>

class car {

int speed;

public:

car(int nSpeed = 0) {speed = nSpeed; }

car operator+(car ob2) {car temp; temp.speed = speed +

ob2.speed; return temp;}

car operator++() {speed++; return *this; }

};

void main() {

car A(30), B(100), C;

A++;

C = A + B;

}

Слід розуміти, що операторна функція може повертати об'єкти любих типів, і що ці типи залежать тільки від конкретного додатку. Проте, як правило, операторні функції повертають об'єкти класів, з якими вони працюють.

Перевантаження операторів за допомогою дружніх функцій

Оператори можна перенавантажувати за допомогою дружніх функцій, які не являються членами класу. Це означає, що дружні функції не отримують неявно покажчик this. Отже, перевантажена операторна функція отримує параметри явно. Таким чином, при перевантаженні бінарного оператора дружня функція отримує два параметри, а при перевантаженні унарного оператора — один. Першим параметром дружньої функції, що перенавантажує бінарной оператор, є його лівий операнд, а другим — правий операнд.

Наступна програма демонструє перевантаження унарного та бінарного операторів за допомогою дружніх функцій.

 

#include <iostream.h>

class car {

int speed;

public:

car(int nSpeed=0) { speed = nSpeed; }

friend car operator+(car lp, car rp);

friend car operator--(car &ob);

};

car operator+(car lp, car rp) {

car temp;

temp.speed = lp.speed + rp.speed;

return temp;

}

car operator--(car &ob) {

ob.speed--;

return ob;

}

Якщо дружні функції застосовуються для перевантаження операторів інкременту та декременту, їх операнди слід передавати за допомогою посилань. Це необхідно тому, що дружня функція не отримує покажчика this. Оператор "++", наприклад, повинен модифікувати свій операнд. Якщо перенавантажувати цей оператор за допомогою дружньої функції, як завжди, то операнд буде передаватися по значенню. Це означає, що дружня функція не зможе змінити цей параметр. Проте цю проблему можна вирішити, якщо передати операнд дружній функції за допомогою посилання. В цьому випадку всі зміни усередині функції будуть відбиватися на її фактичному параметрі.


 

А также другие работы, которые могут Вас заинтересовать

464. Мікроконтроллери 3x3x3 LED куб 643.5 KB
  3x3x3 LED куб це фігура яка складаються з 27 світлодіодів, яку використовують переважно для дизайну інтер'єру. Різні сфери використання 3x3x3 LED куба. Розробка програмного і технологічного продукту, створення мікросхеми та розробка програми.
465. Построение современных систем автоматизации теплоэнергетического оборудования на базе свободно-программируемых контроллеров (ПЛК) 565 KB
  Структура подсистем автоматизации отопительного котла. Котлоагрегат как объект регулирования. Задачи контура регулирования разрежения в топке котла. Разработка программы оценки экономии электроэнергии при внедрении ЧРП. Расчет эксплуатационных затрат на автоматизацию.
466. Знакомство с операционной системой MS DOS та Windows XP 315 KB
  Основные команды MS DOS. Основные команды работы с файлами и каталогами. Знакомство с программой Volkov Commander. Принципы организации многозадачной работы в системе. Исследование методов запуска программы Проводник.
467. Градієнтний метод числової оптимізації задач нелінійного програмування 1.16 MB
  Застосування градієнтного методу, коли обмеження на область зміни змінних х відсутні. Застосування градієнтного методу, коли наявні обмеження на область зміни змінних х. ознайомлення з градієнтним методом числової оптимізації, набуття навиків розв’язку та аналізу задач нелінійного програмування градієнтним методом.
468. Инженерные решения постройки много квартирных домов старого образца 197.5 KB
  Ознакомление с постройками много квартирных домов старого образца, инженерными системами этих домов, системами энергосбережения этих домов (до реконструкции, после реконструкции).
469. Концепція суспільства К. Поппера 130 KB
  Комплексний аналіз сутності й складових концепції суспільства К.Поппера, її ролі у системі філософських знань людства про суспільство, а також сучасної практичної цінності вказаної концепції. Критичний раціоналізм як методологічна основа соціальної теорії К.Поппера.
470. Расчёт себестоимости и формирование плановой сметы затрат для выполнения работы по теме: Восстановление данных с мобильного телефона 474.84 KB
  Теоретическая составляющая. Критерии и показатели, определяющие смету затрат на выполнение работы по оптимизации работы ПК. Расчёт затрат на основные и вспомогательные материалы. Расчёт затрат на ремонт, содержание и эксплуатацию оборудования и оснастки.
471. Теория системно-информационного подхода 1.46 MB
  Информационный принцип максимальной энтропии. Определения количества возможных схем разделения исходной смеси. Задача выбора оптимальной схемы разделения. Оптимальная декомпозиция ректификационной системы. Распределение концентраций компонентов в выходных потоках.
472. Создание реалистического изображения трехмерной сцены методом трассировки лучей 254.5 KB
  Базовые возможности и входной язык программы синтеза реалистических изображений на основе метода трассировки лучей, разработать трехмерный композитный объект с применением операций конструктивной твердотельной геометрии (CSG).