Г. Шилдт - С#4.0 Полное руководство (1160795), страница 53
Текст из файла (страница 53)
Бьон () ( Сопяо1е. Иг1сеьгпе (); с = Ь + 10) // сложить объект типа ТЬгеео и целое значение типа гпс Сопзо1е.нгьсе("Результат сложения Ь + 10: ")) с. Бьон (); Сопзо1е.нггсе11пе (); с = 15 + Ь( // сложить целое значение типа 1пс и объект типа ТЬгееб Сопзо1е.иггсе("Результат сложения 15 + Ь: ")) с.БЬон(); ) Выполнение этого кода дает следующий результат. Координаты точки а: 1, 2, 3 Координаты точки Ь: 10, 10, 10 Результат сложения а + Ь: 11, 12, 13 Результат сложения Ь + 10: 20, 20, 20 Результат сложения 15 + Ь: 25, 25, 25 Перегрузка операторов отношения Операторы отношения, например == и <, могут также перегружаться, причем очень просто.
Как правило, перегруженный оператор отношения возвращает логическое значение Сгце и Га1зе. Это вполне соответствует правилам обычного применения подобных операторов и дает возможность использовать их перегружаемые разновидности в условных выражениях. Если же возвращается результат другого типа, то тем самым сильно ограничивается применимость операторов отношения. Ниже приведен очередной вариант класса тьгеег), в котором перегружаются операторы < и >. В данном примере эти операторы служат для сравнения объектов Тпгее(), исходя из их расстояния до начала координат.
Один объект считается больше другого, если он находится дальше от начала координат. А кроме того, один объект считается меньше другого, если он находится ближе к началу координат. Такой вариант реализации позволяет, в частности, определить, какая из двух заданных точек находится на большей сфере. Если же ни один из операторов не возвращает логическое значение сгце, то обе точки находятся на одной и той же сфере. Разумеется, возможны и другие алгоритмы упорядочения. 282 Часть (. Язык С№ ив1пц Яувгеы( // Класс длл хранениа трехмерных координат. с1авв ТЛгеео ( гпс х, у, г) // трехмерные координаты рпЬ1гс ТЛгеео[) ( х = у и = 0; ) рпьзгс ТЛгеео(упс 1, Тпс 7, Тпя К) ( х = г; у = 17 г ор1, ТЛгеео ор2) * ор1.у + ор1.г * ор1.г) < * ор2.у + ор2.г * ор2.г)) ор1, ТЛгеео ор2) * ор1.у е ор1.г * ор1.г) > * ор2.у + ор2.г * ор2.г)) // Перегрузить операторы < и >.
// Перегрузить оператор <. рпЬ1гс всасус Ьоо1 орегаяог <(ТЬгеео ( 11(МаГЛ.Яогс(ор1.х * ор1.х + ор1.у Ма<Л.Яогс (ор2.х * ор2.х + ор2.у Гзоихо СГПЕ7 е1ве гевпгп Га1ве( ) Перегрузить оператор >. роьзгс вяас1с Ьоо1 орегагог >(ТЛгеео ( 1й(МаГЛ.Яя(гс (ор1.х * ор1.х + ор1.у Маоь.яя)гс (ор2.х * ор2.х + ор2.у геепгп Ггпе; е1ве геворга Та1ве7 ) // Вывести координаты Х, У, 2.
рпЬ11с чо10 ЯЛон() ( Сопво1е.нг1сеьапе(х + ", " + у + ) ) с1авв ТЛгееооеыо ( всас).с чо1<( Магп() ( ТЛгееО а = пен ТЬгеео(5, б, 7)7 ТЬгееО Ь = пен ТЬгееО(10, 10, 10); ТЛгеео с = пен ТЛгеео(1, 2, 3)) ТЬгеео с( = пен ТЬгеео(6, 7, 5); Сопво1е.кг11е("Координаты точки а а.ЯЬон()) Сопво1е.мг1се("Координаты точки Ь Ь.ЯЛон()( Сопво1е.иг1яе("Координаты точки с с.ЯЬон()7 Сопво1е.кг1ге("Координаты точки б б.ЯЛон () 1 Сопво1е.мг1ге11пе()7 )' )( )( )/ Глава 9.
Перегрузка операторов 283 гт(а > с) Сспзс1е.иг1се11пе("а > с истинно"); 11(а < с) сспзс1е.игггеыпе("а < с истинно"); гт(а > Ы Сспзс1е.иг1ге11пе("а > Ь истинно"); 11(а < Ь)-Сспзс1е.нгьсеЬгпе("а < Ь истинно"); 11(а > б) Сспзс1е.нггсеъгпе("а > б истинно"); е1ае 1Г(а < щ Сспас1е.Иггсеъгпе("а < б истинно"); е1зе Сспас1е.нг1сеьгпе("Точки а и б находятся на одном расстоянии " "ст начала отсчета"); Вот к какому результату приводит выполнение этого кода. Координаты точки а: 5, б, 7 Координаты точки Ь.
"10, 10, 10 Координаты точки с: 1, 2, 3 Координаты точки б: б, 7, 5 а > с истинно а < Ь истинно Точки а и б находятся на одном расстоянии ст начала отсчета На перегрузку операторов отношения накладывается следующее важное ограничение: они должны перегружаться попарно. Так, если перегружается оператор <, то следует перегрузить и оператор >, и наоборот. Ниже приведены составленные в пары перегружаемые операторы отношения. И еще одно замечание: если перегружаются операторы == и ! =, то для этого обычно требуется также переопределить методы ()Ь7 ес с . К<(на 1з ( ) и С)Ь1 ест .
Сеспазпсобе () . Эти методы и способы их переопределения подробнее рассматриваются в главе 11. Перегрузка операторов ~гие и йа1зе Ключевые слова Ьгне и Га1зе можно также использовать в качестве унарных операторов для целей перегрузки. Перегружаемые варианты этих операторов позволяют определить назначение ключевых слов Ггпе и Та1зе специально для создаваемых классов. После перегрузки этих ключевых слов в качестве унарных операторов для конкретного класса появляется возможносп использовать объекты этого класса для управления операторами 1Г, ИЬ11е, Гог и бо-ИЬ11е или же в условном выражении?. Операторы ьгие и та1зе должны перегружаться попарно, а не раздельно.
Ниже приведена общая форма перегрузки этих унарных операторов. риЬ11с зсасгс Ьссг срегассг Сгпе (тил параметра операнд) ( г'/ возврат логического значения ггне или Га1зе. 284 Часть 1. Язык С() рпЫгс ягаг1с Ьоо1 орегагог Га1яе(тип параметра операнд) ( Возврат логического значения Ггпе или Еа1яе. ) Обратите внимание на то, что и в том и в другом случае возвращается результат типа Ьоо1.
Ниже приведен пример программы, демонстрирующий реализацию операторов Ггпе и га1яе в классе ТЬгееР. В каждом из этих операторов проверяется следующее условие: если хотя бы одна из координат объекта типа ТЬгееО равна нулю, то этот объект истинен, а если все три его координаты равны нулю, то такой объект ложен. В данном примере программы реализован также оператор декремента исключительно в целях демонстрации. // Перегрузить операторы Ггпе и Га1яе для класса ТЬгееО. о51ПЧ Зуягею) // Класс для хранения трехмерных координат. с1авя ТЬгееО ! 1пг х, у, г) // трехмерные координаты рпЬ1гс ТЬгеео() ( х = у = г = О) ) рпЫгс ТЬгеео(1пс г, 1пс З, гпс Х) ( х = г) у = З) г = Х) ) // Перегрузить оператор Ггпе. рпЬ11с ясас1с Ьоо1 орегасог Ггпе(ТЬгеео ор) ( 11((ор.х != 0) )) (ор.у (= 0) )) (ор.г != 0)) геспгп Ггпе) // хотя Оы одна координата не равна нулю е1яе гегпгп Га1ве; Перегрузить оператор Га1ве. роь11с ягаггс ьоо1 орегаьог га1яе(тьгееО ор) ( гс((ор.х == 0) вв (ор.у == О) ав (ор.г == 0)) гегпгп ггое) // все координаты равны нулю е1яе геспгп Га1яе; ) // Перегрузить унарный оператор рпЫгс всас1с тЬгееО орегасог — (тЬгеео ор) ( ТЬгеео геяп1Г = пен ТЬгееО(); // Возвратить результат декрементирования.
гевп1Ы х = ор.х — 1; геяп1г.у = ор.у — 1; геяп1г.г = ор.г — 1; гегогп геяп1г; Пава 9. Перегрузка операторов 288 г'7 Вывести координаты Х, у, 2. рць11с чогс Яьон() ( сопво1е.иг1геь1пе(х т ", " + у т ", " + г)г ) с1авв Тгцета1вебещо ( ягас1с тога нагл() ( Тьгеео а = пен Тьгеео(5, б, 7)) Тьгеео Ь = пен Тьгеео(10, 10, 10)) Тьгееп с = пен Тьгеео(0, О, О)) Сопяо1е.пгтге("Координаты точки а: ")г а. Яьон (); Сопво1е.Игтье("Координаты точки Ь: "); Ь. ЯЛ (); Сопво1е.Хггье("Координаты точки с: "); с.ЯЛон()г Сопво1е.нггсеЬ1пе(); 1г(а) Сопяо1е.игтгеь1пе("Точка а истинна.") е1яе Сопво1е.нгггеьвпе("Точка а ложна."); 12(Ь) Сопва1е.Игтсеьгпе("Точка Ь истинна."); е1яе Сопяо1е.нгтсеьтпе("Точка Ь ложна."1; 12(с) Сопяо1е.игггеьтпе("Точка с истинна.") е1яе Сопяо1е.нгтсевзпе("Точка с ложна.")г Сопяо1е.игтсе11пе() Сопяо1е.нгтье11пе("Управление циклом с помощью объекта класса Тьгеео."): г)о [ Ь.ЯЛон(); Ь вЂ” —; ньг1е (Ь) ' Выполнение этой программы приводит к следующему результату.
Координаты точки а: 5, б, 7 Координаты точки Ь: 10, 10, 10 Координаты точки с: О, О, 0 Точка а истинна Точка Ь истинна Точка с ложна Управление циклом с помощью объекта класса Тьгееп. 10, 10, 10 286 Часть 1. язык Ся' 9, 9, 9 в, в, в 7, 7, 7 б, б, б 5, 5, 5 з, з, з 2, 2, 2 1, 1, 1 Обратите внимание на то, как объекты класса ТЬгееР используются для управления условным оператором 15 и оператором цикла с)о-ып11е. Так, в операторах 15 объект типа ТЬгееО проверяется с помощью оператора сгпе.
Если результат этой проверки оказывается истинным, то оператор 1 Т выполняется. А в операторе цикла г)о-нп11е объект Ь декрементируется на каждом шаге цикла. Следовательно, цикл повторяется до тех пор, пока проверка объекта Ь дает истинный результат, т.е. этот объект содержит хотя бы одну ненулевую координату. Если же окажется, что объект Ь содержит все нулевые координаты, его проверка с помощью оператора Оспе даст ложный результат и цикл завершится. Перегрузка логических операторов Как вам должно быть уже известно, в С)) предусмотрены следующие логические операторы: й, ), !, й й и ! ) .
Из них перегрузке, безусловно, подлежат только операторы й, ) и ! . Тем не менее, соблюдая определенные правила, можно извлечь также пользу из укороченных логических операторов й й и ! ) . Все эти возможности рассматриваются ниже. Простой способ перегрузки логических операторов Рассмотрим сначала простейший случай. Если не пользоваться укороченными логическими операторами, то перегрузку операторов й и ) можно выполнять совершенно естественным путем, получая в каждом случае результат типа Ьоо1. Аналогичный результат, как правило, дает и перегружаемый оператор ! .
Ниже приведен пример программы, в которой демонстрируется перегрузка логических операторов !, й и ) для объектов типа ТпгееР. Как и в предыдущем примере, объект типа ТЬгее0 считается истинным, если хотя бы одна из его координат не равна нулю. Если же все три координаты объекта равны нулю, то он считается ложным. О Простой способ перегрузки логических операторов // !, ) и й лля объектов класса ТпгееР.