68948

Перевантаження операторів

Лекция

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

Перевантаження скорочених операторів присвоєння Обмеження на перевантаження операторів З перевантаженням функцій тісно пов’язаний механізм перевантаження операторів. У мові C можна перенавантажувати більшість операторів набудувавши їх на конкретний клас.

Украинкский

2014-09-27

40 KB

2 чел.

Лекція № 10

Тема: Перевантаження операторів

План:

  1.  Перевантаження операторів
  2.  Створення операторної функції члена
  3.  Створення префіксної і постфіксної форм операторів інкрементації і декрементації.
  4.  Перевантаження скорочених операторів присвоєння
  5.  Обмеження на перевантаження операторів

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

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

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

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

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

тип_возвращаемого_значения имя_класса::operator# (список-аргументів)

{

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

}

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

Розглянемо простій приклад. Ця програма створює клас 1ос, в якому зберігаються географічні координати: широта і довгота. У ній перевантажується оператор "+". Уважно вивчите цю програму, приділяючи особливу увагу визначенню функції operator* ().

#include <iostream>

using namespace std;

class loc {

int longitude, latitude;

public:

loc() {}

loc(int lg, int It) { longitude = lg; latitude = It; }

void show() {

cout « longitude « " ";

cout « latitude « "\n";

}

loc operator+(loc op2);

};

// Overload + for loc.

loc loc::operator+(loc op2)

{

loc temp;

temp.longitude = op2.longitude + longitude; temp.latitude = op2.latitude + latitude;

return temp;

}

int main() {

loc ob1(10, 20), ob2( 5, 30);

obl.show(); // Виводить на екран числа 10 20 ob2.show(); // Виводить на екран числа 5 30

оb1 = оb1 + оb2;

obl.show(); // Виводить на екран числа 15 50

return 0;

}

Як видимий, функція operator* Про має тільки один параметр, не дивлячись на те, що вона перенавантажує бінарного оператора. (Як відомо, бінарних операторів мають два операнди.) Причина полягає в тому, що операнд, що стоїть в лівій частині оператора, передається операторній функції неявно за допомогою покажчика this. Операнд, що стоїть в правій частині оператора, передається операторній функції через параметр ор2. Звідси слідує важливий висновок: при перевантаженні бінарного оператора виклик операторної функції генерується об'єктом, що стоїть в лівій частині оператора.

Як правило, переобтяжені операторні функції повертають об'єкт класу, з яким вони працюють. Отже, переобтяженого оператора можна використовувати усередині виразів. Наприклад, якби операторна функція operator* () повертала об'єкт іншого типу, наступний вираз був би невірним.

ob1  =  оb1  +  оb2;

Для того, щоб привласнити суму об'єктів оB і оb2 об'єкту оB, необхідно, щоб результат операції + мав тип loc.

Крім того, оскільки операторна функція operator* () повертає об'єкт типу loc, допускається наступний вираз:

(оb1+оb2).show() ;   //  Виводить  на  екран  суму obl+ob2

У цій ситуації операторна функція створює тимчасовий об'єкт, який знищується після повернення з функції show().

 

Створення префіксної і постфіксної форм операторів

інкрементації і декрементації

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

loc operator++(int x);

Якщо символи ++ передують операндам, викликається операторна функція ореrаtor++ (), якщо символи ++ слідують за операндами, викликається операторна функція operator++(int x).

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

 

Перевантаження скорочених операторів присвоювання

Скорочених операторів привласнення (наприклад, "+=", "-=" і т.п.) також можна перенавантажувати. Розглянемо операторну функцію operator+= () для класу 1ос.

loc loc::operator+=(loc op2){

longitude = op2.longitude + longitude;

latitude = op2.latitude + latitude;

return *this;

}

Обмеження на перевантаження операторів

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

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


 

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

44561. Создание интегрированной системы управления 30.5 KB
  Из-за этого очень трудно создать единую интегрированную систему управления корпоративной сетью которая бы контролировала все процессы и все системы сети сеть здесь понимается в широком смысле как объединение всех слоев от компьютеров до приложений. Тем не менее потребность в такой системе управления имеется так как все подсистемы сети тесно взаимосвязаны и при управлении коммуникационным оборудованием могут потребоваться данные об установленных в операционных системах приложениях или о конфигурационных параметрах коммуникационных...
44562. Усугубление проблем безопасности при удаленном доступе. Защитные экраны - firewallы и proxy-серверы 31.5 KB
  Однако использование общественных сетей (речь в основном идет об Internet) еще более усугубляет ситуацию, хотя бы потому, что в такой сети для доступа к корпоративным данным в распоряжении злоумышленника имеются более разнообразные и удобные средства, чем выход в чистое поле с анализатором протоколов.
44563. Пакетная фильтрация. Использование маршрутизаторов в качестве firewall 29.5 KB
  Пропуск во внутреннюю сеть пакетов сетевого уровня или кадров канального уровня по адресам MCадреса IPадреса IPXадреса или номерам портов TCP соответствующих приложениям.
44564. Сервисы-посредники (Proxy-services) 30 KB
  Для того чтобы обратиться к удаленному сервису клиент-пользователь внутренней сети устанавливает логическое соединение с сервисом-посредником работающим на межсетевом экране. Сервис-посредник устанавливает отдельное соединение с настоящим сервисом работающим на сервере внешней сети получает от него ответ и передает по назначению клиенту пользователю защищенной сети.
44565. Критерии выбора корпоративной ОС 31 KB
  Среди основных требований которым должна отвечать корпоративная ОС можно указать следующие: функциональная полнота разнообразие поддерживаемых сервисов; производительность запросы к серверам должны обрабатываться с преемлемым уровнем задержек; масштабируемость характеристики производительности сетевой ОС должны сохраняться неизменными в широком диапазоне изменения параметров системы то есть сеть должна хорошо работать и тогда когда число пользователей и рабочих станций измеряется тысячами число серверов сотнями объемы...
44566. Функционал КИС как определяющий фактор выбора ее структуры 35.5 KB
  Очевидно что в состав КИС должны войти средства для документационного обеспечения управления информационной поддержки предметных областей коммуникационное программное обеспечение средства организации коллективной работы сотрудников и другие вспомогательные технологические продукты. Из этого в частности следует что обязательным требованием к КИС является интеграция большого числа программных продуктов. Наполнение предметной части КИС может существенно изменяться в зависимости от профиля деятельности предприятия включая например...
44567. Создание инфосистем на основе системы автоматизации деловых процессов 36 KB
  Из зарубежных систем это в первую очередь ction Workflow фирмы ction Techologies и продукт фирмы Stffwre Inc. Работа workflowсистем как правило основывается на том что большая часть деловых процессов представляет собой периодически повторяемую отрегулированную последовательность действий выполнение заданий которая может быть легко формализована. Таким образом без всякого программирования можно за считанные минуты получить реально работающее workflowприложение. В некоторых workflowсистемах создание информационных моделей деловых...
44568. Основные компоненты и типы ЛВС 44.5 KB
  ЛВС имеют модульную организацию. Компоненты ЛВС Выделяется два основных типа ЛВС: одноранговые peertopeer ЛВС и ЛВС на основе сервера server bsed. Выбор типа ЛВС зависит от: размеров предприятия; необходимого уровня безопасности; объема сетевого трафика; финансовых затрат; уровня доступности сетевой административной поддержки.
44569. Одноранговые сети. Рабочая группа 45.5 KB
  Все пользователи решают сами какие данные и ресурсы каталоги принтеры факсмодемы на своем компьютере сделать общедоступными по сети Одноранговая сеть Рабочая группа – это небольшой коллектив объединенный общей целью и интересами. Эти сети относительно просты.