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


 

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

79703. ПРАВОВЫЕ СЕМЬИ СОВРЕМЕННОСТИ 65.5 KB
  Современная юридическая наука изучая теорию права предпочитает оперировать не понятием тип права а такими научными категориями как правовая система и правовая семья. Соответственно выделяют следующие основные правовые семьи: романогерманскую континентальную; англосаксонскую семью общего права; семью социалистического права; мусульманскую; африканскую. Строгая иерархия источников форм права среди которых безусловно главным является закон. Деление права на частное и публичное.
79704. Система права и система законодательства 60.5 KB
  Различия, существующие между понятиями «система права» и «правовая система» позволяет отделять два объекта изучения друг от друга: система права представляет собой лишь один из элементов правовой системы государства, наряду с правоотношениями, правосознанием, юридическими принципами и институтами, правовой культурой общества и др
79705. ПРАВОВАЯ НОРМА. ВИДЫ НОРМ ПРАВА. СТРУКТУРА НОРМЫ ПРАВА 104 KB
  Поскольку норма права представляет собой одну из разновидностей социальных норм, целесообразно вспомнить определение понятия «социальная норма» и перечислить уже известные виды социальных норм. Основываясь на знаниях можно определить, что под нормой права
79706. Реализация права. Пробелы в праве и юридические коллизии. Акт применения права 133 KB
  Начиная рассмотрение вопроса о реализации права, следует обратить внимание на то, что издание правовых норм не является самоцелью. Нормы права издаются для того, чтобы они реализовывались, претворялись в жизнь.
79707. Понятие и признаки правоотношения. Юридические факты, их виды. Юридические презумпции и юридические фикции 94 KB
  Под правоотношением в широком смысле понимается возникшая до ее закрепления в закону особая форма социального взаимодействия участники которого обладают определенными правами и обязанностями и реализуют их в целях удовлетворения своих потребностей и интересов в особом порядке не запрещенном государством. Например в англосаксонской правовой системе сначала судьи разрешали отдельные казусы и лишь потом законодатель формулировал их в специальном акте в качестве нормы права. В узком смысле под правоотношением понимается разновидность...
79708. ПРАВОСОЗНАНИЕ И ПРАВОВАЯ КУЛЬТУРА. ПРАВОМЕРНОЕ ПОВЕДЕНИЕ И ПРАВОНАРУШЕНИЕ 63.5 KB
  Неправомерное поведение в теории права принято называть правонарушением. Последняя наступает тогда когда есть состав правонарушения то есть необходимые и достаточные признаки для наступления юридической ответственности. Отличие же правонарушения от аморального проступка проводится прежде всего по признаку противоправности.
79709. Понятие и признаки юридической ответственности. Обстоятельства, исключающие юридическую ответственность 69.5 KB
  Юридическая ответственность - это неблагоприятные последствия личного, имущественного и специального характера, налагаемые государством на правонарушителя в установленной законом процессуальной форме.
79710. Понятие правового регулирования, его предмет и методы. Пределы эффективности правового регулирования 117 KB
  В отличие от предмета правового регулирования отдельной отрасли права предметом регулирования права в целом являются общественные отношения. Регулировать общественные отношения - значит вводить их в определенные рамки, способствовать их развитию.
79711. Законность: понятие и принципы. Гарантии законности. Правопорядок 55 KB
  Гарантии законности. В юридической литературе существует несколько точек зрения относительно субъектов законности лиц на которых распространяются ее требования и сферы ее действия. По его мнению нарушения законов совершенные гражданами и другими лицами не являются нарушениями законности а лишь нарушают правопорядок. Лазарев утверждает что ограничение субъектов законности должностными лицами неоправданно: законность распространяется на всех и не содержит какихлибо изъятий.