Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 52
Текст из файла (страница 52)
*/ геви1т.х = ор1.х — ор2.х; геви1т.у = ор1.у — ор2.у) геяи1т.к = ор1.я — ор2.гт гетигп геяи1тт ) // Перегрузить унарный оператор — . рибатс ятаттс ТЬтееб орегатог †(ТЬтееО ор) ( ТЬгееО геяи1Г = пен ТЬтееО()т геяи1т.х = -ор.хт геви1т.у = ор у1 геяи1г.я = -ор.ят гетигп геви1ст ) // Перегрузить унарный оператор +т. риь11с ягагтс тьгееО оретагог ++(тнгееО ор) ( ТЬгееО геви1Г = пен ТЬгееО()т // Возвратить результат инкрементирования. геяи1г.х = ор.х + 1; геяи1т.у -" ор.у + 1т геяи1т.х = ор.я + 12 Глава 9.
Перегрузка операторов 2еы1 гесцгп геяц1Г; ) // Вывести координаты Х, у, 5. рцЬ11с чо1к( 5Лои() ( сопяо1е.иг1ге11пе (х + ", " + у + ", " + г) т ) с1аяя ТЬгееООеио ( якасас чогп Магд() ( ТЛгееО а = печ ТЬгееО(1, 2, 3)Г Тпгеер Ь = пеи Тпгеео(10, 10, 10) ТЛгееО с = пеи ТЬгееО()г Сопяо1е.Иг1ое("Координаты точки а: "); а.5Лон()т СОпзс1е.нг1Ге11пе()т Сопяо1е.нггое("Координаты точки Ь: "); Ь.
5Ьон () т сопяо1е.игагеОгпе()т с = а т Ьт // сложить координаты точек а и Ь Сопяо1е.нггае("Результат сложения а т Ь: ")т с.5Лон () ) Сопяо1е.нггсе11пе(); с = а + Ь т сг // сложить координаты точек а, Ь и с Сопяо1е.нггсе("Результат сложения а + Ь + с: "); с.зпон(); Сопяо1е.Иг1оет апе () т с = с — аг // вычесть координаты точки а сопяо1е.иг1ге("Результат вычитания с — а: ")т с.ВЬоч(); Сопяо1е.нг1ое11пе()т с = с - Ьт // вычесть координаты точки Ь Сопяо1е.нг1се("Результат вычитания с — Ь: "); с.ВЬои()т Сапяо1е.нгасе11пе(); с = -ат // присвоить точке с отрицательные // координаты точки а Сопзо1е.нггке("Результат присваивания -а: ")т с.ВЛои () г Сопяо1е.нг1Геаапе()т с = а++; // присвоить точке с координаты точки а, // а затем инкрементировать их Сопяо1е.нггкетапе("Если с = а++")г Сопяо1е.Иггсе("то координаты точки с равны "); с.
5Лою () т 262 Часть ). Языг С() Сопзо1е.нг1ое("а координаты точки а равны "); а. Епон () г // Установить исходные координаты (1,2,3) точки а а пен ТЬгееп(1, 2, 3); Сопзо1е.ит1ое("1пустановка исходных координат точки а: "); а. ЕЬон (); с = ++а4 // инкрементировать координаты точки а, // а затем присвоить их точке с сопзо1е.иг1сеь1пе("1песли с = +та"); Сопзо1е.игапе("то координаты точки с равны "); с.5пон(); Сопзо1е.игъое("а координаты точки а равны ")4 а.звон(); ) ) Вот к какому результату приводит выполнение данной программы: Координаты точки а: 1, 2, 3 Координаты точки Ь: 10, 10, 10 Результат сложения а + Ь: 11, 12, 13 Результат сложения а + Ь + с: 22, 24, 25 Результат вычитания с — а: 21, 22, 23 Результат вычитания с — Ь: 11, 12, 13 Результат присваивания -а: -1, -2, -3 Если с = ать то координаты точки с равны 1, 2, 3 а координаты точки а равны 2, 3, 4 Установка исходных координат точки а: 1, 2, 3 Если с = ++а то координаты точки с равны 2, 3, 4 а координаты точки а равны 2, 3, 4 Выполнение операций со встроенными в СФ типами данных Для любого заданного класса и оператора имеется также воз)ножность перегрузить сам операторный метод.
Это, в частности, требуется для того, чтобы разрешить операции с типом класса и другими типами данных, в том числе и встроенными. Вновь обратимся к классу тпгееп. На примере этого класса ранее было показано, как оператор + перегружается для сложения координат одного объекта типа тЬгееп с координатами другого. Но Глава 9.
Перегрузка операторов 263 это далеко не единственный способ определения операции сложения для класса Т)ггееО. Так, было бы не менее полезно прибавить целое значение к каждой координате объекта типа Т)ггееО. Подобная операция пригодилась бы для переноса осей координат. Но для ее выполнения придется перегрузить оператор + еще рзз, как показано ниже. // Перегрузить бинарный оператор ь для сложения объекта О типа тлгееп и целого значения типа 1пс.
рцЫгс всас1с Тпгеео орегасог ь(тьгеео ор1, гпс ор2) ( Тьгееп гезц1Г = пен Тьгееп(); гезц1г.х = ор1.х ь ор2; гезц1с.у = ор1.у + ор2) гезц1с.г = ор1.г + ор2; гесцгп гевц1Г; ) Как видите, второй параметр операторного метода имеет тип Тпг. Следовательно, в этом методе разрешается сложение целого значения с каждым полем объекта типа Т)ггееО. Такая операция вполне допустима, потому что, как пояснялось выше, при перегрузке бинарного оператора один из его операндов должен быть того же типа, что и класс, для которого этот оператор перегружается. Но у второго операнда этого оператора может быть любой другой тип.
Ниже приведен вариант класса т)ггееО с двумя перегружаемыми методами оператора +. // Перегрузить бинарный оператор + дважды: один раз— // для сложения объектов класса Тлгеео, а другой раз— О для сложения объекта типа Тпгееп и целого значения // типа гпс. цзгпо зувгелц // Класс для хранения трехмерных координат. с1азз Тпгееп ( гпг х, у, г; // трехмерные координаты рцЫгс Тьгееэ() ( х = у = г = О; ) рцЫгс Тьгееп(гпс г, гпс 1, Тпс К) ( х = 1; у = зг г = Ки О Перегрузить бинарный оператор + дпя сложения // объектов класса тьгееп.
рцЫ1с згаг1с тьгееО орегагог ь(тьгееО ор1, тьгееп ор2) ( Тпгеео гезц1Г = пен Тпгееэ()) /* Сложить коорлинаты двух точек и возвратить результат. */ гезц1с.х = ор1.х + ор2.х; гезц1с.у = ор1.у + ор2.у) гезц1с.г = ор1.х ь ор2.г; гесцгп гезц1Г; ) // Перегрузить бинарный оператор + для сложения 264 Часть ). Язык СК // объекта типа ТЬгеев и целого значения типа 1пс. рцЬ11с всаггс Тпгеео орегасог т(тпгеео ор1, гпс ор2) ( ТЬгеео гевц1Г = лен Тпгеев()," гевц1г.х = ор1.х т ор2т гевц1с.у = ор1.у + ор2) гевц1х.х = ор1.х т ор2; гесцгп' гевц1Г; ) О Вывести'координаты Х, у, Е. рцвггс чо10 5Ьон() ( сопво1е.игггеьгпе(х + ", " + у т ", " + х) ) ) ) с1авв ТЬгееооежо ( всасгс чо10 Магп П ( ТЬгеев а = пен ТЬгеео(1, 2, 3); Тпгеев Ь = лен Тпгеео(10, 10, 10)т ТЬгеев с = печ Тпгеео()т Сопво1е.иггхе("Координаты точки а: ")т а.зпоы()) Сопво1е.иггсе11пе()т Сопво1е.иггсе("Координаты точки Ь: ")т Ь.5Ьою() т Сопво1е.иггсе11пе()т с = а ь Ьт // сложить объекты класса ТЬгеев Сопво1е.иггсе("Результат сложения а + Ь: ") с.зпон(); Сопво1е.нггсеъгпе()т с = Ь + 10; // сложить объект типа Тигеев и целое // значение типа ТЬГ Сопво1е.иггсе("Результат сложения Ь ь 10т ")к с.5Ьон()т ) ) При выполнении этого кода получается следуюший результат: Координаты точки ат 1, 2, 3 Координаты точки Ь: 10, 10, 10 Результат сложения а ь Ь: 11, 12, 13 Результат сложения Ь + 10: 20, 20, 20 Как подтверждает приведенный выше результат, когда оператор ь применяется к двум объектам класса тьгееО, то складываются их координаты.
А когда он применяется Глава в. Перегрузка операторов 265 к объекту типа ТЬгееР и целому значению, то координаты этого объекта увеличиваются на заданное целое значение. Продемонстрированная выше перегрузка оператора +, безусловно, расширяет полезные функции класса ТЬгееР, тем не менее, она делает это не до конца. И вот почему. Метод орегаеог+ (ТЬгееР, Тле) позволяет выполНять опеРации, подобные следующей: оЫ = оЬ2 + 10т Но, к сожалению, он не позволяет выполнять операции, аналогичные следующей: оЫ = 10 т оЬ2т Дело в том, что второй целочисленный аргумент данного метода обозначает правый операнд бинарного оператор +, но в приведенной выше строке кода целочисленный аргумент указывается слева.
Для того чтобы разрешить выполнение такой операции сложения, придется перегрузить оператор т еще раз. В этом случае первый параметр операторного метода должен иметь тип Тпс, а второй параметр — тип тьгееР. Таким образом, в одном варианте метода орегагогт () выполняется сложение объекта типа ТЬгееР и целого значения, а во втором — сложение целого значения и объекта типа ТЬгееР. Благодаря такой перегрузке оператора + (или любого другого бинарного оператора) допускается появление встроенного типа данных как с левой, так и с правой стороны данного оператора.
Ниже приведен еще один вариант класса ТпгееР, в котором бинарный оператор + перегружается описанным выше образом. // Перегрузить бинарный оператор + трижды: один раз— // для сложения объектов класса ТЬгеео, второй раз— // для сложения объекта типа ТЬгеео и целого значения // типа Тпп, а третий раз — для сложения целого значения // типа 1пк и объекта типа ТЬгееп. цз1пд Яузкезп // Класс для хранения трехмерных координат. с1азз ТЬгеео ( 1пг х, у, гт // трехмерные координаты рцЬ11с Тпгеев() ( х = у = г = от ) рцЫгс ТЬгеев(1пк 1, Тпк 0, 1пк К) ( х = гт у = 1т г = Кт ) // Перегрузить бинарный оператор + для сложения // объектов класса ТЬгеев.
рцЫ1с зкакзс Тлгеев орегаког +(ТЬгееп ор1, ТЬгееР ор2) ( ТЬгеео гезц1г = пен ТЬгееп()1 /* Сложить координаты двух точек и возвратить результат. */ гезц1е.х = ор1.х + ор2.хт гезц1г.у = ор1.у + ор2.у; гезц1к.г = ор1.г + ор2.г; гетцгп гезц1г; ) // Перегрузить бинарный оператор + для сложения 266 Часть (. Язык С» // объекта типа Тпгееб и целого значения типа 1пт.
риЫ1с вгаттс ТЬтееО орегатог ь(ТЬгееО ор1, гпт ор2) ( ТЬтееб геяи1Г = пен Тпгееб(); геви1т.х = ор1.х + ор2) теяи1т.у = ор1.у Ь ор2; геви1т.г = ор1.г + ор2; тетигп теви1Г; ) // Перегрузить бинарный оператор + для сложения // целого значения типа тпс и объекта типа Тптееб. риЫтс ятаттс ТЬгееО орегатог +(тпт ор1, ТЬгееО ор2) ( ТЬгееО геяи1Г пен ТЬгееО(); тевигг.х = ор2.х ь ор1) геви1т.у = ор2.у + ор1( геви1т.г = ор2.г + ор1( гетигп теяи1Г; ) // Вывести координаты Х, у, Е. риЬ11с чотб 5Ьон() ( Сопяо1е.йг1те1.тле (х + ", " + у + ", " + г); ) с1авя ТЬгееООеыо ( ятаттс чозб Иа1п() ( Тпгееб а = пен ТЬгееО(1, 2, 3)т Тпгееб Ь = пен Тпгееб(10, 10, 10)т Тпгееб с = лен ТЬгееО(); Сопво1е.йгтте("Координаты точки а: ")к а. 5Ьон () т Сопво1е.йг1тейапе()) Сопво1е.йгтте("Координаты точки Ь: "); Ь.
5Ьон () т Сопяо1е.йгтгейапе()т с = а т Ь! // сложить объекты класса ТЬгееО Сопяо1е.йгтте("Результат сложения а + Ь: ") с.впон(); Сопво1е.йг1те11пе(); с = Ь + 10т // сложить объект типа ТЬгееО и целое // значение типа тпс Сопяо1е.йгтсе("Результат сложения Ь + 10: ")т с.впон() т Сопво1е.йттсестпе()( Глава 9. Перегрузка операторов 267 с = 15 + Ьг // сложить целое значение типа Тпк и // объект типа Тпгееп Сопао1е.нгъке("Результат сложения 15 + Ь: ")т с.