Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 10
На сайте нет зарегистрированных пользователей

Пользователей: 13,367
новичок: lanoyac4
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Лабораторная работа по динамическим спискам на Turbo Pascal (удаление ду...
Расчет мер близости на отношениях на Delphi + Пояснительная записка
моделирование процесса поступления заявок в ЭВМ на GPSS + Пояснительная ...

Перегрузка операций
В главе 1 мы сконструировали класс, позволяющий нам оперировать денежными суммами. Мы можем использовать тип TMoney почти так же, как и встроенные типы. Однако реализация операций не совсем удовлетворительна. Например, сложение было у нас реализовано следующим образом:
a=b.AddMoney(d);



Согласитесь, что сложение денежных сумм более естественно записать так: a=b+d;
Эту проблему можно решить за счет перегрузки операций (см. п. 13.5 в [1]). Перегрузка операций — это развитие механизма перегрузки функций и еще одно проявление полиморфизма в С++.
Нужно сказать, что в С++ мы постоянно пользуемся перегруженными операциями. Символ + (плюс) обозначает операцию сложения целых и дробных чисел. Этот же символ используется для обозначения операции сцепления строк типа st ri ng. Для вывода денежных сумм на экран мы использовали операцию <<, которая определена еще в С как операция сдвига влево. А операция присваивания по умолчанию перегружена вообще для всех типов данных, как встроенных, так и определяемых.
С++ во многом ограничивает перегрузку операций. Во-первых, разрешается перегружать только встроенные (табл. 3.1) операции (см. п. 5 в [1]) — новых определять нельзя. Во-вторых, даже встроенные операции разрешено перегружать не все. Запрещена перегрузка следующих операций:
? селектор компонента объекта (.);
? разыменование указателя на компонент класса (. *);
? условная операция (? :);
? указание области видимости (::);
? определение размера аргумента (si zeof).


Не допускается также перегрузка операций препроцессора # и ##.
В-третьих, операции можно перегружать только для нового типа данных — нельзя перегрузить операцию для встроенного типа. Например, нельзя перегрузить операцию А как операцию возведения в степень ни для double, ни для другого стандартного встроенного числового типа. Чтобы определить операцию возведения в степень, нам придется сначала объявить новый тип данных. В С++ новый тип данных можно образовать с помощью конструкций enum, union, struct и class.

Таблица 3.1. Операции С++ в порядке убывания приоритетов
Операция Назначение Использование
Область видимости ::name
class::name
namespace::name
Селектор компонента класса object.member
-> Доступ к члену класса по указателю pointer -> member
[] Индексирование variable[expr]
0 Вызов функции function()
++ Инкремент постфиксный lvalue++
- Декремент постфиксный lvaluesizeof Размер объекта sizeof expr
sizeof Размер типа sizeof(type)
++ Префиксный инкремент ++lvalue
Префиксный декремент -lvalue
- Побитовое НЕ -expr
! Логическое НЕ lexpr
- Унарный минус -expr
+ Унарный плюс +expr
*. Разыменование *expr
& Адрес &expr
0 Приведение типа (type)expr
new Выделение памяти new type
new type(exprlist)
new[] Выделение памяти под массив new type[]
delete Освобождение памяти delete pointer
delete[] Освобождение памяти из-под массива delete[ ] pointer
->* Разыменование указателя на компонент pointer->*pointer_to_member
класса по указателю
* Разыменование указателя на компонент object.*pointer_to_member
класса
Операция Назначение Использование
* Умножение ехрг * ехрг
/ Деление' ехрг / ехрг
% Деление по модулю ехрг % ехрг
+ Сложение ехрг + ехрг
- Вычитание ехрг - ехрг
« Сдвиг влево ехрг « ехрг
» Сдвиг вправо ехрг » ехрг
< Меньше ехрг < ехрг
<= Меньше или равно ехрг <= ехрг
> Больше ехрг > ехрг
>= Больше или равно ехрг >= ехрг
== Равно ехрг == ехрг
!= Не равно ехрг != ехрг
& Побитовое И ехрг & ехрг
л Побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ ехрг А ехрг
1 Побитовое ИЛИ ехрг | ехрг
&& Логическое И ехрг && ехрг
II Логическое ИЛИ ехрг || ехрг
?: Условная операция ехрг ? ехрг * ехрг
= Присваивание L-значение = ехрг
•-, /=.
+-. -=.«-,
»-, &=, к Составное присваивание (относительный порядок приоритетов соответствует порядку приоритетов операций без присваивания) L-значение += ехрг и т. д.
Запятая ехрг, ехрг



Операции можно перегружать либо как независимые внешние функции (и только такой способ перегрузки возможен для enum), либо как методы класса. Но и тут С++ имеет свои ограничения. Четыре операции допускается перегружать только методами класса:
? присваивание (=);
? вызов функции (());
? индексирование ([ ]);
? доступ по указателю (->).

Причем операция присваивания единственная создается системой автоматически, если не определена программистом явно. В офисных зданиях важно иметь генератор на случай отключения электроэнергии - http://www.gc-azimut.ru тут недорого.
Таким образом, эти операции в принципе нельзя перегрузить для конструкции enum. Однако и без перегрузки эти операции почти всегда корректно работают с новым типом. Остальные операции допускается перегружать как методами класса, так и независимыми внешними функциями.
Прототип функции-операции выглядит следующим образом: тип
operator@(cnncoK параметров);



Здесь @ — символ операции. Слово operator является зарезервированным словом и может использоваться только в определении или в функциональной форме вызова операции. Синтаксис и приоритет перегружаемой операции изменить нельзя. Это означает, что унарную операцию нельзя сделать при перегрузке бинарной и наоборот. Следовательно, при перегрузке унарных и бинарных операций нельзя использовать параметры по умолчанию. При перегрузке таких операций нет никакой возможности задать список параметров переменной длины. Единственная операция, которая не имеет фиксированного количества аргументов, — это операция вызова функции operator (). Остальные операции должны иметь либо один, либо два аргумента. Операции +, -, * и & допускается перегружать и как унарные, и как бинарные.

ООО "Группа компаний Азимут"
123458 Москва, ул. Кулакова 20, стр 1А.
тел. (495) 781-8472, 781-8473
www.gc-azimut.ru
Опубликовал Kest August 30 2013 15:14:00 · 0 Комментариев · 4283 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
AddPage [Исходник...
De Knop
iChat v.7.0 Final...
Создание фракталов
Tetris 2002
Abbrevia
TrayIcon
Progressbar
В.Понамарев - COM...
Моделирование дви...
Проигрыватель Mp3
AJAX и PHP. разра...
Динамические за...
Шаблон для новост...
LaserTank [Исходн...
Медиа комбайн
Мод "проверочный ...
Halcyon
Работа с матрицами
Counter [Исходник...

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97832
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10290
Turbo Pascal fo... 7373
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Перечный шираз
Теперь рассмотрим ...
Как правильно иска...
Определяется сущес...
клиент/сервер с кл...
Играть онлайн бесп...
10 Заблуждений при...
10-9):Табл
7.10. Просеивай ...
Правила работы с ф...
Язык С: класс памяти
Что агентство IANA...
Политика выделения...
Тильда (~)
МОДЕЛЬ С АКТИВНОЙ...
Панель управления ...
Чтение файлов MS W...
Брандмауэр добавит...
Цели, стоящие пере...
Оба подхода в данн...
Отделка балконов
Обеды рабочим
Изучение влияния и...
Web-сервис
Нельзя все на один...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?