|
Программирование >> Структурное программирование
FIG8 6.СРР V7 II Драйвер для класса Date #include <iostream.h> #include datel.h mam ( { Date dl, d2{12,27 ,1992), d3(0, 99, 8045); cout dl равна dl endl d2 равна d2 endl d3 равна d3 << endl endl; Vj;: cout << d2 += 7 равна (d2 += 7) endl endl; d3.setDate(2, 28, 1992); cout << d3 равна d3 endl; cout ++d3 равна ++d3 endl endl; Date d4(3, 18, 1969); cout << Проверка операции префиксного инкремента: << endl << d4 равна d4 endl; cout << ++d4 равна ++d4 endl; cout << d4 равна << d4 << endl << endl; cout << Проверка операции постфиксного инкремента: << endl d4 равна d4 endl; cout << d4++ равна d4++ endl; cout << d4 равна << d4 << endl << endl; ;urn 0; } Рис. 8.6. Определения функций-элементов класса Date (часть 5 из 6) dl равна Январь 1, 1900 d2 равна Декабрь 27, 1992 d3 равна Январь 1, 1900 d2 += 7 равна Январь 3, 1993 d3 равна Февраль 28, 1992 ++d3 равна Февраль 29, 1992 Проверка операции префиксного инкремента: d4 равна Март 18, 1969 ++d4 равна Март 19, 1969 >> d4 равна Март 19, 1969 Проверка операции постфиксного инкремента: . : 7 d4 равна Март 19, 1969 d4++ равна Март 19, 1969 d4 равна Март 20, 1969 Рис. 8.6. Выходные данные драйвера класса Date (часть 6 из 6) больше не существует. Возвращение ссылки на локальную переменную является типичной ошибкой, которую трудно найти. Резюме Операция используется в С++ для многих целей: и как операция поместить в поток, и как операция сдвига влево. Это пример перегрузки операции. Подобным же образом перегружается операция ; она используется и как операция взять из потока, и как операция сдвига вправо. С++ предоставляет программисту возможность перегружать большинство операций и делать их чувствительными к контексту, в котором они используются. Компилятор генерирует соответствующий код, основываясь на способе использования операции. Перегрузка операций способствует расширяемости С++. Операции перегружаются путем составления описания функции (с заголовком и телом). Имя функции состоит из ключевого слова operator, после которого записывается перегружаемая операция. Чтобы использовать операцию над объектами классов, эта операция должна быть перегружена, но есть два исключения. Операция присваивания (=) может быть использована с каждым классом без явной перегрузки, выполняя по умолчанию побитовое копирование данных-элементов класса. Операция адресации (&) также может быть использована с объектами любых классов без перегрузки; она просто возвращает адрес объекта в памяти. Перегрузка операций обеспечивает такие же краткие выражения для типов, определенных пользователем, какие С++ обеспечивает с помощью богатого набора операций для встроенных типов. Большинство операций С++ можно перегружать. Старшинство и ассоциативность операций не может быть изменено перегрузкой. При перегрузке операций нельзя использовать аргументы по умолчанию. Изменить количество операндов, которое берет операция, невозможно: перегруженные унарные операции остаются унарными, перегруженные бинарные операции остаются бинарными. Нельзя создавать обозначения для новых операций; перегружать можно только существующие операции. Перегрузка не может изменять смысл работы операций с объектами встроенного типа. При перегрузке (), [], -> или = функция перегрузки операции должна быть объявлена как элемент класса. Функциии-операции могут быть, а могут и не быть функциями-элементами. Если функция-операция реализуется как функция-элемент, крайний левый операнд должен быть объектом того класса (или ссылкой на объект того класса), элементом которого является функция. Если левый операнд должен быть объектом другого класса, эта функция операция должна быть реализована не как функция-элемент. I Глава 8 Функции-элементы операций вызываются только в случае, если левый операнд бинарной операции или единственный операнд унарной операции являются объектом того класса, элементом которого является функция. Можно выбирать для перегрузки операции функцию, не являющуюся элементом, чтобы обеспечить коммутативность операции (т.е. давая соответствующие определения перегруженной операции, можно иметь в качестве левого аргумента операции объект другого типа данных). Унарную операцию класса можно перегружать как нестатическую функцию-элемент без аргументов, либо как функцию, не являющуюся элементом, с одним аргументом; этот аргумент должен быть либо объектом класса, либо ссылкой на объект класса. Бинарную операцию можно перегружать как нестатическую функцию-элемент с одним аргументом, либо как функцию, не являющуюся элементом, с двумя аргументами (один из этих аргументов должен быть либо объектом класса, либо ссылкой на объект класса). Операция индексации массива [] не ограничена применением только к массивам; ее можно использовать для выделения элементов из других видов классов-контейнеров, таких, как связные списки, строки, словари и так далее. Кроме того, индексы - это не обязательно целые числа; можно использовать, например, символы и строки. Конструктор копии используется, чтобы в качестве начальных значений элементов одного объекта задать значения элементов другого объекта того же класса. Конструктор копии вызывается всякий раз, когда возникает необходимость в копировании объекта, например, при вызове по значению, когда объект возвращается из вызванной функции, или при инициализации объекта, который должен быть копией другого объекта того же самого класса. Конструкторы копии должны получать свои параметры по ссылке. Компилятор не может сам по себе знать, как осуществлять преобразования между встроенными типами и типами, определенными пользователем. Программист должен явно указать, как выполнять такие преобразования. Эти преобразования могут быть выполнены с помощью конструкторов преобразований - конструкторов с единственным аргументом, которые преобразуют объекты разных типов (включая встроенные типы) в объекты данного класса. Операция преобразования (называемая также операцией приведения) может быть использована для преобразования объекта одного класса в объект другого класса или в объект встроенного типа. Такая операция преобразования должна быть нестатической функцией-элементом; операция преобразования этого вида не может быть дружественной функцией. Конструктор преобразования - это конструктор с единственным аргументом, используемый для преобразования аргумента в объект класса данного конструктора. Компилятор может вызывать такой конструктор неявно. Операция присваивания - наиболее часто перегружаемая операция. Обычно она используется для того, чтобы присвоить один объект дру-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |