Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Перегрузка (переопределение) операций

Программная реализация RSA примерно в 100 раз медленнее программной реализации DES.

Недостаток

асимметричная криптосистема RSA имеет малое быстродействие по сравнению с симметричными криптосистемами.

С развитием технологии эти оценки могут несколько изменяться, но асимметричная криптосистема RSA никогда не достигнет быстродействия симметричных криптосистем.

Следует отметить, что малое быстродействие криптосистем RSA ограничивает область их применения, но не перечеркивает их ценность.

 

С++ позволяет переопределить действие большинства операций, так чтобы при использовании с объектами конкретного класса они выполняли заданные действия. Операции могут быть перегружены глобально или в пределах класса. Как и в случае перегруженных функций С++ в целом, компилятор определяет различия в операциях по контексту вызова: по числу и типам аргументов операндов.

Переопределенные операции реализуются как функции с помощью ключевого слова operator. Имя перегруженной функции должно быть operatorХ, Х – перегруженный оператор.

Ключевое слово operator, за которым следует символ оператора, называется именем операторной функции.

Переопределение может быть выполнено для целого ряда операций, некоторые из которых для примера приведены в таблице:

Оператор Название Тип
, запятая Бинарный
! Логическое не Унарный
!= Не равно Бинарный
& Адрес Унарный
* Умножение Бинарный
+ Сложение Унарный
- Вычитание Унарный
++ Инкремент Унарный
= Присваивание Бинарный
< Меньше Бинарный
<< Сдвиг влево Бинарный
== Равно Бинарный
delete Удаление -

 

Например, чтобы перегрузить оператор сложения, нужно определить функцию с именем operator+, а чтобы перегрузить оператор сложения с присваиванием, нужно определить функцию operator+=.

Обычно компилятор вызывает эти функции неявно, когда перегруженные операторы встречаются в коде программы. Тем не менее, их можно вызывать и непосредственно.

Однако есть операции, которые нельзя перегружать

. Выбор члена
.* Выбор члена по указателю
:: Оператор расширения области видимости
?: Оператор условия
# Препроцессорный символ
## Препроцессорный символ

Операторные функции перегруженных операций, за исключением new и delete должны подчиняться следующим правилам:

1. Операторная функция должна быть либо нестатической функцией-членом класса, либо принимать аргумент типа класса или перечислимого типа, либо аргумент, который является ссылкой на тип класса или перечислимый тип.

2. Операторная функция не может изменять число аргументов или приоритеты операций и их порядок выполнения по сравнению с использованием соответствующего оператора для встроенных типов данных.

3. Операторная функция унарного оператора, объявленная как функция член, не должна иметь параметров. Если она объявлена как глобальная функция, она должна иметь один параметр.

4. Операторная функция бинарного оператора, объявленная как функция член, должна иметь один параметр. Если она объявлена как глобальная функция, она должна иметь два параметра.

5. Операторная функция не может иметь параметров по умолчанию.

6. Первый параметр операторной функции (если он есть) объявленной как функция-член, должна иметь тип класса объекта, для которого вызывается соответствующий оператор. Никакие преобразования типа для первого оператора не выполняются.

7. За исключением операторной функции оператора присваивания операторные функции класса наследуются его производными классами.

8. Операторные функции =, [], (), -> должны быть нестатическими функциями-членами и не могут быть глобальными.

Для переопределения операции используется особая форма элемента-функции с заголовком такого вида:

[friend] <тип> operator <операция> (<список параметров-операндов>)

При этом:

- Имя функции состоит из ключевого слова operator и символа данной операции в синтаксисе языка Си { operator <операция > }.

- Список формальных параметров функции является списком операндов (количество, типы, способы передачи) операции{ список параметров-операндов }..

- Результат функции (тип, способ передачи) является результатом переопределяемой операции{ <тип> }.

- Способ передачи и тип указывают на возможности использования результата в других выражениях.

Имеется два способа описания функции, соответствующей переопределяемой операции:

1. Если функция задается как обычная элемент-функция класса, то первым аргументом соответствующей операции является объект, ссылка на который передается неявным параметром this;

2. Если первым аргументом переопределяемой операции не является объект некоторого класса, либо функция получает на вход не ссылку на объект, а сам объект, тогда соответствующая элемент-функция должна быть определена как дружественная с полным списком аргументов. Естественно, что полное имя дружественной функции-оператора не содержит при этом имени класса.

Операция-функция, вызываемая с аргументами, ведет себя как операция, выполняющая определенные действия с операндами в выражении. Операция-функция изменяет число аргументов или правила приоритета и ассоциативности операции, сравнительно с ее нормальным использованием.

Рассмотрим небольшой пример. Пусть рассматривается комплексное число с двумя параметрами - действительная и мнимая части. И нужно сложить два комплексных числа. По известным уже правилам мы это сделаем следующим образом:

class TComplex

{

double real, imag;

public:

 

TComplex ()// встроенный конструктор

{ real = imag = 0; }

 

TComplex (double r=0, double i = 0)//еще один конструктор

{

real = r; imag = i;

}

}

Мы можем легко разработать функцию для сложения комплексных чисел, например,

TComplex Add(TComplex c1, TComplex c2);

Однако будет более естественным и удобным иметь возможность записать:

TComplex c1(0,1), c2(1,0), c3

c3 = c1 + c2;

вместо

c3 = AddComplex(c1, c2);

Заметим, что с помощью перегрузки можно совершенно изменить смысл операторов для некоторого класса. Однако рекомендуется не делать этого, т.к. это затрудняет понимание программы. Перегруженный оператор, как правило, должен следовать семантике его поведения для встроенных типов.

<== предыдущая лекция | следующая лекция ==>
Криптосистемы RSA реализуются как аппаратным, так и программным путем | Перегрузка бинарных операторов
Поделиться с друзьями:


Дата добавления: 2014-01-03; Просмотров: 686; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.