Программирование >>  Структурное программирование 

1 ... 166 167 168 [ 169 ] 170 171 172 ... 342


Хороший стиль программирования 8.3

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

Хотя перегрузка операций звучит экзотически, большинство программистов неявно регулярно ее используют. Например, операция сложения выполняется для целых чисел, чисел с плавающей запятой и с удвоенной точностью совершенно по-разному. Но тем не менее сложение прекрасно работает с любыми типами - int, float, double и многими другими встроенными типами, потому что операция сложения перегружена в самом С-Ь-Ь.

Операции перегружаются путем составления описания функции (с заголовком и телом), как это вы обычно делаете, за исключением того, что в этом случае имя функции состоит из ключевого слова operator, после которого записывается перегружаемая операция. Например, имя функции operator-b можно использовать для перегрузки операции сложения.

Чтобы использовать операцию над объектами классов, эта операция должна быть перегружена, но есть два исключения. Операция присваивания (=) может быть использована с каждым классом без явной перегрузки. По умолчанию операция присваивания сводится к побитовому копированию данных-элементов класса. Мы увидим вскоре, что такое побитовое копирование опасно для классов с элементами, которые указывают на динамически выделенные области памяти; для таких классов мы будем явно перегружать операцию присваивания. Операция адресации (&) также может быть использована с объектами любых классов без перегрузки; она просто возвращает адрес объекта в памяти. Но операцию адресации можно также и перегружать.

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

С-Ы- - язык, богатый операциями. Те из программирующих на С-Ь-Ь, кто понимает смысл и контекст каждой операции, сделают, вероятно, обоснованный выбор, когда придется перегружать операции для новых классов.

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

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



Операции, которые могут быть перегружены

+ - * /

~ ! = <

>

/= %= £,=

= == != <=

>=

&&

->* , -> []

delete

Рис. 8.1. Операции, которые могуг быть перегружены

Операции, которые не могут быть перегружены

sizeof

Рис. 8.2. Операции, которые не могут быть перегружены

Типичная ошибка программирования 8.1

Попытка перегрузить операцию, запрещенную для перегрузки.

Старшинство операций не может быть изменено перегрузкой. Это могло бы привести к щ;екотливым ситуациям, в которых операция перегружается таким образом, для которого установленное в языке старшинство не подходит. Однако с помощ;ью скобок можно принудительно изменить последовательность оценки перегруженных операций в выражениях.

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

Изменить количество операндов, которое берет операция, невозможно: перегруженные унарные операции остаются унарными, перегруженные бинарные операции остаются бинарными. В С++ не может быть перегружена единственная тернарная операция ?:. Каждая из операций &, *, + и - может иметь унарный и бинарный варианты; эти унарные и бинарные варианты могут перегружаться раздельно.

Создавать новые операции невозможно; перегружать можно только уже существующие операции. Это запрещает программисту использовать популярные нотации, подобные операции **, используемой в BASIC для экспоненты.

Хороший стиль программирования 8.4

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

8.3. Ограничения на перегрузку операции

Большинство операций С++ перегружать можно. Они показаны на рис. 8.1. На рис. 8.2 показаны операции, которые перегружать нельзя.



Типичная ошибка программирования 8.2

Попытка создавать новые операции.

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

Типичная ошибка программирования 8.3

Попытка изменить работу операции с объектами встроенного типа. Замечание по технике программирования 8.2

По меньшей мере один аргумент функции-операции должен быть объектом класса или ссылкой на объект класса. Это предохраняет программиста от изменения работы операции с объектом встроенного типа.

Перегрузка операций присваивания и сложения, разрешающая такие операторы, как

object2 = object2 + objectl;

не означает, что операция -f-= также перегружается с целью разрешить такие операторы, как

object2 += objectl;

Это может быть достигнуто только путем явной перегрузки операции += для данного класса.

Типичная ошибка программирования 8.4

Предположение, что перегрузка операции (такой как +) автоматически перегружает связанные с ней операции (такие как +=). Операции можно перегружать только явно; неявной перегрузки не существует.

Хороший стиль программирования 8.5

Чтобы обеспечить согласованность связанных операций используйте одни из них для реализации других (т.е. используйте перегруженную операцию + для реализации перегруженной операции +=).

8.4. Функции-операции как элементы класса и как дружественные функции

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



1 ... 166 167 168 [ 169 ] 170 171 172 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика