Навигация
Главная
Поиск
Форум
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
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 65039
Модуль Forms 64832
Пример работы с... 63212
ТЕХНОЛОГИИ ДОСТ... 61544
Имитационное мо... 57379
Реклама
Сейчас на сайте
Гостей: 3
На сайте нет зарегистрированных пользователей

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

Калькулятор на Delphi с переводом в другую систему исчисления + Блок схемы
Расчет размера дохода на одного человека в Turbo Pascal
Сравнение двух бинарных деревьев на Turbo Pascal + отчет

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Перегрузка операций
В главе 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 19:14:00 · 0 Комментариев · 3188 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Delphi Быстрый Ст...
PDA версия сайта
Самоучитель PHP 5...
OnlineIP
45 уроков по дельфи
UmEdit
WordReport
XPmenu
ScreenSaver [Исхо...
Tank [Исходник на...
IpEditAdress
Учебник по создан...
Разработка клиент...
PCX
Шаблон для новост...
Шейдеры в Delphi
Win-Prolog 3.618
Strawberry Prolog...
Открытие Cd-ROM'a...
De Knop

Топ загрузок
Приложение Клие... 100464
Delphi 7 Enterp... 86600
Converter AMR<-... 20077
GPSS World Stud... 12629
Borland C++Buil... 11748
Borland Delphi ... 8555
Turbo Pascal fo... 7037
Visual Studio 2... 4998
Калькулятор [Ис... 4759
FreeSMS v1.3.1 3541
Случайные статьи
Борьба с вредоносн...
Index TOP 20 (дохо...
основное имя польз...
Microsoft и NetWar...
Зарегистрировать и...
Ускоренное деление
Следует ли защищат...
Integer or real co...
Отправить обратные...
Межпроцессовые вза...
Тестирование
Как мне пометить с...
Предикат functor(T...
Команды факс-модема
Ограничения, связа...
включают NIS для м...
Алгоритм расширени...
Нагрузка на процес...
Регулярные выражения
Предикат поиска по...
Переписать элемент...
PRINT (НАПЕЧАТАТЬ)
Использование Drag...
Определение вторич...
Построение символь...
Статистика



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


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