Г. Шилдт - С#4.0 Полное руководство (1160795), страница 52
Текст из файла (страница 52)
рпьтгс вгас1с тпгееО орегагог ++(тлгееО ор) ( ТпгееО гевп1Г = пен ТнгееО()) // Возвратить результат инкрементирования. геви1в.х = ор.х + 1; геви1г.у = ор.у + 1; геви10.г = ор.в + 1; гегогп геяо1г; ) // Вывести координаты Х, У, Б. риЬ11с чо10 БПон() ( сопво1е.игтге11пе(х т ", " + у + ", " + г) т ) ) с1авв ТпгееООежо ( всас1с тога Иатп() ( ТпгееО а = пен ТпгееО(1, 2, 3)) ТпгееО Ь = пен ТпгееО(10, 10, 10) ТпгееР с = пен ТпгееР(); сопво1е.нггсе("Координаты точки а. "")т а.впон(); Сопво1е.йг1пе01пе() ) Сопво1е.нг1ве("Координаты точки Ь: "); Ь.БПон(): Сопво1е.пгасе11пе()т с = а + Ь) // сложить координаты точек а и Ь Сопво1е.иг1пе("Результат сложения а + Ь: ") с. Бпон () ) Сопво1е.иг1се11пе()т с = а + Ь + с) // сложить координаты точек а, Ь и с Сопво1е.иггсе("Результат сложения а + Ь ь с: "); с.впоу (): Сопво1е.иг1се01пе()т 276 Часгь ).
Язык С() с = с — аГ // вычесть координаты точки а Сопво1е.йгьге("Результат вычитания с — а: ") с.ЯЬои()г сопзо1е.йтгсеьгпе()г с = с — Ьг // вычесть координаты точки Ь Сопзо1е.йт1пе("Результат вычитания с — Ь: ") с.ЯЬои()г Сопво1е.йггее11пе() г с = -а) // присвоить точке с отрицательные координаты точки а Сопво1е.йт1пе("Результат присваивания -а: "); с.ЯЬои()г Сопво1е.йтзпеььпе(); с = а++) // присвоить точке с координаты точки а, // а затем инкрементировать их Сопзо1е.йтзтепзпе("Если с = а++")) Сопво1е.йхзве("то координаты точки с равны ")г с.ЯЬои() г Сопзо1е.йгзпе("а координаты точки а равны "); а.ЯЬои()г // Установить исходные координаты (1,2,3) точки а а = пеи Тйтеео(1, 2, 3)Г Сопво1е.йхгге("~пустановка исходных координат точки а: ") а.ЯЬои()г с = ++а/ // инкрементировать координаты точки а, // а затем присвоить их точке с Сопво1е.йхгсе11пе("гпксли с = ++а")г Сопао1е.йсЕСе("то координаты точки с равны ")г, с.ЯЬои()г Сопзо1е.йгьте("а координаты точки а равны ")Г а.ЯЬои() г ) Вот к какому результату приводит выполнение данной программы.
Координаты точки а: 1, 2, 3 Координаты точки Ь: 10, 10, 10 Результат сложения а + Ь: 11, 12, 13 Результат сложения а + Ь + с: 22, 24, 26 Результат вычитания с — а: 21, 22, 23 Результат вычитания с — Ъ: 11, 12, 13 Результат присваивания -а: -1, -2, -3 Если с = а++ то координаты точки с равны 1, 2, 3 Глава 9. Перегрузка операторов 277 а координаты точки а равны 2, 3, 4 Установка исхолных координат точки а: 1, 2, 3 Если с = т+а то координаты точки с равны 2, 3, 4 а координаты точки а равны 2, 3, 4 Выполнение операций со встроенными в С№ типами данных Для любого заданного класса и оператора имеется также возможность перегрузить сам операторный метод.
Это, в частности, требуется для того, чтобы разрешить операции с типом класса и другими типами данных, в том числе и встроенными. Вновь обратимся к классу ТЛгееР. На примере этого класса ранее было показано, как оператор + перегружается для сложения координат одного объекта типа ТЛгееР с координатами другого. Но это далеко не единственный способ определения операции сложения для класса ТЛгееР. Так, было бы не менее полезно прибавить целое значение к каждой координате объекта типа ТЛгееР.
Подобная операция пригодилась бы для переноса осей координат. Но для ее выполнения придется перегрузить оператор т еще раз, как показано ниже. О Перегрузить бинарный оператор + для сложения объекта типа ТЛгееО и целого значения типа Тпс. риЛ11с ясасгс ТЛгееО орегасог +(ТЛгееО ор1, гпс ор2) ТЛгееО геяи1Г = пеи ТЛгееО()т геяи1т.х = ор1.х + ор2; геви1Г. у = ор1. у + ор2; геяи1с.г = ор1.г + ор2; гегигп геяи1г; ) Как видите, второй параметр операторного метода имеет тип 1пс. Следовательно, в этом методе разрешается сложение целого значения с каждым полем объекта типа ТЛгееР. Такая операция вполне допустима, потому что, как пояснялось выше, при перегрузке бинарного оператора один из его операндов должен быть того же типа, что и класс, для которого этот оператор перегружается.
Но у второго операнда этого оператора может быть любой другой тип. Ниже приведен вариант класса ТЛгееР с двумя перегружаемыми методами оператора ы УУ Перегрузить бинарный оператор + дважды: О один раз — для сложения объектов класса ТЛгееО, !/ а другой раз — для сложения объекта типа ТЛгееО и целого значения типа гпс. ияъпд Буягегм Класс для хранения трехмерных координат. с1аяя ТЛгееО 1пг х, у, г; // трехмерные координаты 278 Часть 1. Язык С(т риЬ1гс Тдгееб() ( х = у = г = О) ) риыгс тьтееО(гпг 1, гпг 2, зпт х) ( х = г; у = 21 х = х; У* Сложить геяи1Г.
х теяи1Ыу = геяи1г.т координаты двух точек и возвратить результат. */ ор1.х + ор2.х) ор1.у + ор2.у; ор1.х т ор2.т) гетигп гевитг; ) Перегрузить бинарный оператор + для сложения // объекта типа ТЬгееб и целого значения типа 1пт. риЫ1с ягат1с Тьтееб орегагог +(Тпгееб ор1, 1пс ор2) ( Тьгееб геяи1Г = пеи Тьтееб(); геяи1т.х = ор1.х + ор2) геяи1т.у = ор1.у + ор2) теяи1Ы х = ор1.в + ор2) гетигп геви1г) Вывести координаты Х, У, Е.
риЪ1гс чо1б Бьон() ( СОПяО1Е.ХтТГЕОТПЕ(Х Е ", " + у + ", " т Г) ) ) ) с1авя Тдгееббеыо ( ягагтс чогб Мати() ( Тьгееб а = пеи ТЬгееО(1, 2, 3)т ТЬгееО Ь = пеи Тьгееб(10, 10, 10)т Тьгееб с = пен Тьтееб(); Сопяо1е.иггте("Координаты точки а: ")) а.ЯЬои()т Сопяо1е.нгзтеьзпе()) Сопяо1е.нггте("Координаты точки Ь: "); Ь.ВЬон(): Сопяо1е.кггтеьзпе()) с = а + Ь) У/ сложить объекты класса ТЬгееО Сопяо1е.игтте("Результат сложения а + Ъ: ")) с.збон(); Сопяо1е.иг1геьтпе()т с = Ь + 10) // сложить объект типа тьгееО и целое значение типа 1пт Перегрузить бинарный оператор + для сложения объектов класса ТЬгееО.
риыгс ягаггс тьгееО орегатог +(тьгееб ор1, тьтееО ор2) ( Тьгееб теви1т = пеи ТЬгееО(); Глава 9. Перегрузка операторов 279 Сопяо1е.кгьсе("Результат сложения Ь + 10: ") с. Бион () г При выполйении этого кода получается следующий результат. Координаты точки а: 1, 2, 3 Координаты точки Ь: 10, 10, 10 Результат сложения а + Ь: 11, 12, 13 Результат сложения Ь + 10: 20, 20, 20 Как подтверждает приведенный выше результат, когда оператор + применяется к двум объектам класса ТЬгееО, то складываются их координаты.
А когда он применяется к объекту типа тьгееР и целому значению, то координаты этого объекта увеличиваются на заданное целое значение. Продемонстрированная выше перегрузка оператора +, безусловно, расширяет полезные функции класса ТЬгееР, тем не менее, она делает это не до конца. И вот почему. Метод орегабог+ (ТЬгееО, Тпг) позволяет выполнять операции, подобные следующей. оЫ = оЬ2 + 10; Но, к сожалению, он не позволяет выполнять операции, аналогичные следующей. оЫ = 10+ оЬ2; Дело в том, что второй целочисленный аргумент данного метода обозначает правый операнд бинарного оператора +, но в приведенной выше строке кода целочисленный аргумент указывается слева.
Для того чтобы разрешить выполнение такой операции сложения, придется перегрузить оператор + еще раз. В этом случае первый параметр операторного метода должен иметь тип гпг, а второй параметр — тип тьгееО. Таким образом, в одном варианте метода орегасогт () выполняется сложение объекта типа ТЬгееР и целого значения, а во втором — сложение целого значения и объекта типа тЬгееР. Благодаря такой перегрузке оператора т (или любого другого бинарного оператора) допускается появление встроенного типа данных как с левой, так и с правой стороны данного оператора.
Ниже приведен еще один вариант класса ТЬ гее О, в котором бинарный оператор + перегружается описанным выше образом. // Перегрузить бинарный оператор + трижды: // один раз — для сложения объектов класса ТЬгееР, // второй раз — для сложения объекта типа ТЬгее0 и целого значения типа 1пг, // а третий раз — для сложения целого значения типа Тпс и объекта типа ТЬгееР. ця1пч Буягеыг // Класс для хранения трехмерных координат. с1аяя ТЬгееО ( 1пг х, у, я; // трехмерные координаты рцЬ1гс ТЬгееО() ( х = у = г = О( ) рцЫгс ТЬгееО(гпс г, гпс 3, 1пс )г) ( х = 1) у = 3; Я = Хг ) 280 Часть (. Язык С» // Перегрузить бинарный оператор + для сложения объектов класса ТЬгееО. рпЬ11с вгаггс ТЬгееО орегатог +(ТЬгееб ор1, ТЬтееО ор2) ( ТЬгееО гевц1Г = пен ТЬгееО(); /* Сложить координаты двух точек и возвратить результат.
*/ гевц1т.х = 'ор1.х ь ор2.х; теяц1т.у = ор1.у + ор2.у) теяц1т.г = ор1.г + ор2.т) гетцгп гевц1г; ) // Перегрузить бинарный оператор + для сложения // объекта типа тьгееО и целого значения типа гпг. рцазгс всат!с ТЬгееО орегатог +(ТЬгееО ор1, Тпт ор2) ( ТЬгееО гевц1Г = пен ТЬгееб()! теяц1т.х = ор1.х + ор2; гевц1т.у = ор1.у + ор2; гевп1г.т = ор1.т + ор2; гегогп гевц1т! ) // Перегрузить бинарный оператор + для сложения // целого значения типа 1пт и объекта типа ТЬтееО.
роЬ11с ятаттс ТЬтееО орегатот +(1пт ор1, ТЬтееО ор2) ( ТЬгееО геяц1т = пен ТЬгееР()! гевц1т.х = ор2.х + ор1) геяц1г.у = ор2.у + ор1; геяц1т.г = ор2.г + ор1; тетпгп гевц1Г; ) // Вывести координаты Х, у, Е. рцЬ1гс чозб ЯЬон() ( сопяо1е.иг1ге11пе(х ь ", " + у + ", " + т)( ) с1аяя ТЬгееООеыо ( агат!с тога Ма1п() ( ТЬгееб а = пен ТЬтееб(1, 2, 3)( ТЬгееО Ь = пен ТЬтееб(10, 10, !О); ТЬгееО с = пен ТЬгееО(); Сопяо1е.хт1ге("Координаты точки а: а.ЯЬоы(); Глава 9. Перегрузка операторов 281 сопзо1е.игггеШпе()( Сопзо1е.ыггсе("Координаты точки Ь: "); Ь.БЬон(); Сопзо1е.нг1геъгпе()( с = а + Ь( // сложить объекты класса Тогеео Сопзо1е.ыг1се("Результат сложения а ь Ь: "); с.