Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 79
Текст из файла (страница 79)
()1пс1цс[е <Ьозттеав> ()1пс1пс[е <овстуг> ()1пс1пс[е <сятб11Ь> паунд патеярасе асс[; с1аяя ястсуре ( с)лат *р' 1пс 1епу рпЬ11с: зст~уре(сЬат *з); -з1тсуре() ( сопп « "Освобождение памяти по адресу " « (ппяудпес)) р « ' ~п'," бе1есе [)Р/ сЬат *дед() ( теситп р; ястсуре аоретасот=(зстпуре аоЬ)) приложение з. Ответы на вопроси и решения упражнений 553 сбаг йоретатот[) (1пт1); зТттуре: з зтт?уре (сЬат "з) ( тпг 1; 1 — зст1еп(з) + 1; р = пеы сЬаг [1) ) 1?((Ф сонг « "Ошибка выделения памяти1п" з ех5.т (1); 1еп= 1; астору(р, з); .~зз Присваивание объекта вгггуре йзст1урез зоретатот=(зСттуре йоЬ) ~/ Выяснение необходимости дополнительной ззамяти 1Г (1еп < оЬ,1еп) ( // требуется выделение дополни чей памяти йе1ета [) р; р = пеи сЬаг з ?(!р) ? сонг -ззза..-.,—...
1 .замятиз,п" з ех1г (1); ) 1еп = оЬ.1еп; затору(р, оЬ.р); гебагп +б)зйз) /~ Индексируеьезе сзвзволы в сгроке сьаз- азттсуре: зоретатот[) (1пс 1) ( 1й (з.<0 ) ( з.>1еп-1) сенс « «'зпЗнаЧение индекса сонг « 1 « " выходит за границы массива'зп"'з ех1? (1); тетитп р[1); Самоучитель С~~ 1пг та1п() ( асгьуре а("Привет" ), Ь("Здесь" ); СОпг «а.цЕГ() « 'М'; сонг « Ь.дег() « а = Ь) // теперь указатель р не перезаписываетсл соус « а.
де~ () « '~п'; сонь « Ь.деГ() « Доступ к символам посредством индексирования массива сопб « а[О] « а(1) « а[2] « "~п") Присваивание символов посредством индексирования массива а [0) = 'Х'; а[1] .= 'У я а(2) = 'Е'; соус « а.дег() « "'~п"; гегпгп О; 2. ()1пс1пс)е <1ояггеаш> ()1пс1ибе <сяЫ11Ь> пяупд пашеярасе ясс(; с1аяя йупаггау ( 1пе Фр 1пг я1ге; рпЬ11с: с(упаггау (1п~ я]; с[упаггау йорегасог= (с(упаггау йоЬ) 1п. аорега1ог [) (1пГ 1); 22 Конструктор йупаггау:: йупаггау (1пТ я) р = пех 1пл [я); 1Е(!р) соил « "Ошибка выделения памяти~п"р ех1й (1); я1ге = я; В. Ответы на вопросы и решения упражнений 555 Приложение // Перегрузка оператора = для класса с(упаггау с)упаггау айупаггау::орегабог=(с)упаггау йоЬ) )пг 1; з.г(втге!=оЬ.в1ге) совв « "нельзя копировать массивы разных размеров ! зп" ех1г (),',; аког (1=0; 1<ваге; 1+~-) р [1] = оЬ. р[1) гесззгп *ГЬ1в; Перегрузка оператора [] 1пс ас)УпаггаУ:: оРегаЬог[)(зпб 1) ( з1 (з<0 ! ! з.>вз.ге) ( сов( « "зпВначение индекса соц( «! « " выходит за границы массиваз,п"; ех1Т (1) з гегцгп р['] з п~ вза1п () ( 1тзс -' ) с)упаггау оЬ1 (10), оЬ2 (10), оЬЗ (100) оЬ1[3) = 10; = оЬ1[3); соШ « ' « "зп"з оЬ2 = оЬ1; 1 = оЬ2[3)з сов[ « 1 « "зп"з Выполнение следующей инструкции ведет к ощибке оЬ1 = оЬЗ; // присваивание массивов разных размеров гегзгп 0; Проверка усвоения материала главы 6 1.
1! Перегрузка операторов « и » упражнений 557 Приложение В. Ответы на вопросы и решения 2. Ипс1ас?е <говсгеат> пвгпо патпеврасе вгс?; сХавв гЬгее о гпг х, у, риЬ1гс Гпгее с?(гпс ?, ?пО "'., ?пО )с) ( х=т; у ) гпгее с?() ( х = О; у = О; л = О; ~оЫ оег(гпг ь?, ?пО аО, ?пг а)с) ( з.=х; 1 =у; )с=в; Опгее с( орегасог+ (ГЬгее с?оЬ2); Гпгее б орегасог- (ГЬгее с(оЬ2) гпгее с)орегагог++(): Гпгее аорегасог †( ) гпгее с? сЬгее с): сорегагог+ (спгее с? сЬ2) ГЬгее с? сепр.
севр.х =- х + оЬ2.х; севр. у = у + оЬ2.у; севр.ъ = х + оЬ2.г? тесптп ?еспр; ГЬгее с? гЬгее с(::орегаеог- (ГЬгее с?оЬ2) ( ЬЬгее с( гетр; гелер.х = х — оЬ2.х; 1евр, у = у — оЬ2.у; гетр.г = х — оЬ2.г; гегигп Гегр; ГЬгее с? гпгее с(::орегасог++() х++ ? гег~тп *гав~ Самоучитель С++ йЬгее с)сЬгее с)::орепатоп--( ) ( х--; у я Ф' геспсп *пп1я; 1пс ~па1п() оЗ = о1 + о2; оЗ.деп (х, у, г); сои1 « " Х: " « " «~т х « р У' « "~пч; сопя « 2: " « я оЗ = о1 — о2; оЗ.де~(х, у, я) сопя « " Х' " « «у х«",у: « ~ ~ и ~ ~ т сопя « Е: " « к ++о1, о1.сей (х,у, соус « " х: сопя « Е: я); Н « < « и'$,пи . Н « у к); Н « о1.дес(х, у, сопя « " Х: сои~ « 2: х« ",у: « "~п"; П « у «я ге~ип~ 0; 3.
$1пс1пбе <1ояЕкеап> ыя пц пап~еярасе яЬЗ; с1аяя ситес с( 1пс х, у, г; риЫ1с: йЬгее с)(1пС 1, 1пС 3, 1пп х--1; у сйпеес(() ( х= 0; у=О; я =0: ~Палее с( о1(10, 10, 10), о2 (2, 3, 4), оЗ; (пт х, у, Приложение В. Ответы нн вопросы и реыення упражнений .ко1.й деГ ((пп ят, гпп ы), гпг ыЮ вЂ” -х; (=у; )с=в; пЬгее й орегагог+(гЬгее й аоЬ2)у ПЬгее й орегаГог-(ГЬгее с( аоЬ2); йНепй ГЬгее й орегаГог++(ГЬгее й аоЬ) йг(.епй гЬгее й орегагог--(гЬгее й коЬ); ПЬгее й гЬгее й::орегагог+(ГЬгее й аоЬ2) ( гЬгее с( 1етрт Тапер.х = х + оЬ2.х; гетр.у = у + оЬ2.уу гех1р.
г = е + ОЬ2. е; гегпгп петр; ГЬгее й ГЬгее й".:орегаГог-(гЬгее 6 яоЬ2) ГЬгее б сепр; ген,х = х — оЬ2.х; Гевар.у = у — оЬ2.у; ге.пр. г .= к — оЬ2. я; геппгп Гехи; ПЬгее й орегаГог++(ГЬгее й ЯоЬ) оЬ.х++; оЬ.у+и; оЬ. +-; гепигп оЬ; ПЬгее й орегаТог--(ГЬгее б аоЬ) ( оЬ.у--; оЬ. к--; геппгп оЬ; Самоучитель С++ 560 1пс Гва(П () спгее 6 о1(10, 10, 1пс 10), о2 (2, 3, 4), оЗ; оЗ .= о1+ о2; оЗ.дее(х, у, соие с< " х: соус « Е: " с< у; 61 с< «х х « « У1пГ 03 = о1 — а2 оЗ.де'(х, у, соее с< " х: соие с< е: х«",у: « ~ и ~~ с <с у; <с х +-~-о1: о1. дег (х, у, соус« "Х: сопс с< У,: х) ) " с< х«", Ъ': сс "'сп" с с< у' с< г --о1; о1.дес(х, у, сонг <с " Х; сопс <с Х.
г) г м с< х « "', У " « у. « "1п"; гегигп 0; 5, Перегрузка оператора = может потребоваться, когда применяемого по умолчанию поразрядного копирования недостаточно. Например, вам может понадобиться объект, в котором была бы копия только части данных исходного объекта. 7. Фъпо1ос(е <1оатгеасп> еегщ папеераое асс); с1аее спгее с( ( гпс х, у, г; рцЫ1<п сйгее с(((пс (пг ), (пг )с) 4.
Бинарная оператор-функция — член класса получает левый операнд неявно, через указатель 1Ыа. Дружественная бинарная оператор-функция явно получает оба операнда. У унарной оператор-функции — члена класса нет явно заданных параметров. У дружественной унарной оператор-функции есть один параметр. ва вопросы и решения упражнений 567 Ответы Приложение ( х=1;у=1; г=)с; ) ГЬгееа() (х=О; у=Ор г=О; ) чо1о дег [1пг а1, 1пс а1, 1пс аЕ) ( 1 — х~ 3 — у~ )< — г ) 1г1епс( '=Ьгее Й орегагог+ (ГЬгее 6оЬ, 1пп 5г1епа ГЬгее <) орегагог+ (1пп 1, гЬгее <( оЬ) 'гЬгее с( орегагог+(гЬгее о оЬ, пс гЛгее <( 'сепр; гетр.х = оЬ.х ~евр.у = оЬ.у + 1; гевар. г = оЬ. г ~ 1; геппгп сепр; ГЬгее б орегаСог+ (1пс 1, 'сЬгее б оЬ) ( гЬгее <) ге~пр; гетр .
х = оЬ . х т 1; гев~р . у = оЬ . у + Гевар,г = оЬ.г -~ геЬигп Ьепр; 1пппа1п () гЬгее с)о1(10„ 10, 10) 1пп х у, е~ о1=о1+ 10; о1.дег(х, у, г): сопп « " Х: " « х « ", У: " « у; соил « е: " « г « "~п"; о1 = -20 + о1; о1.дег (х, у, г) р сопп« "Х: '* « х « ", у: " « у; « "1п"; сонг « Б; " « г геспсп 0; Самоучитель С++ 8. ()1пс1пбе <йояттеатп> пяйпд пап~еярасе зЬс(," с1аяя сЬгее о 1пт х, уу г; рпЬ11с: гьтее <((йпс 1, 1пт 1, 'пт х=й; у=3 ~ ЬЬтее б() ( х = О; у — — О; г = О; чойс( дет (йпс 81, 1пт й1, 1пт 5)<) ( ) 1пт оретатот== (ЬЬтее й оЬ2) гпь оретасот!=(тьтее аоь2) 1пт орегаОот 1((ЬЬтее т(оЬ2); 1пг гЬгее б::оретатот== (тЬтее боЬ2) гетигп х==оЬ2.х йй у=.=оЬ2 .
у йй г==оЬ2.г; 1пь тЬтее а::оретатот!=(тЬтее с(оь2) ( геяпгп х!=оЬ2.х ЯЯ у!=оЬ2.у йй г!=оЬ2.г; 1пя ЬЬгее о:: оретагот(( (ГЬтее г(оЬ2) ( геяпгп х) (оЬ2.х йй у 1 (оЬ2 . у йй г()оЬ2.г; ) 1пяюайп () 10), о2 (2, 3, 4), оЗ (О, 0„0)1 "Ьтее с( о1(10, 10, "о1 == о11п"; 11(о1==о1) сопя « 1й(о1!=о2) сопя « "о1 != о21п"; йг(оЗ((о1) соус « "о1 ипл оЗ равняется истина1п"; гегигп О; ПриложениеВ.
Ответы ме вопросы и решения упражнений 9. Оператор [~ обычно перегружается для того, чтобы использовать привычный индексный синтаксис для доступа к элементам инкапсулированного в классе массива. Проверка усвоения материала в целом 1. /" в данной программе для простоты не был реализован контроль сшибок. Однако в реально функдионируощем приложении такой контроль обязателен 41пс1пс(е <ьозтгеатс> ()1пс1нс(е <сятггпд> пя1пд патвеярасе зтс)1 с1аяя япгтуре сиат з(В0(с рп)з11с: зстсуре О ( *я = '~о'' ) зггтуре(спаг *р) ( ятгсру(з, р); ) с)1ат *де'() ( тегнтп я; ) зтгтуре орегасог+(зтгтуре я2) яптсуре оретапог=(зггтуре я2); гпс орегаСог<(зтггуре з2); гпт орегатог>(зтгтуре з2); 1пп орегатот= (зтгтуре я2); ятгпуре згтсуре::орегаког+(зтттуре я2) ( ясгсуре тешр; ятгсру (тешр. з, зтгсру(гешр.з, я2 .з); ге штп ' ешр; ятттуре зтгтуре::орега1ог=(зтгсуре з2) ятгсру(я, з2.я); тетдтп *сй1з," тпт зтгтуре::оретатот<(зттсуре з2) гетп и зтгсп~р(з, я?.я) < 0; Самоучитель С++ 5б4 )пС яг гуре::орегагог> (ягггуре я2) ге(итп ясгспр(я, я2.я) > О; ) гпг яТггуре::орегагог==(яггТуре я2) геппгп авгур(я, я2.я) == О; гпг ваагн () ( яггсуре о1("Привет" ), о2(" Здесь" ), оз; оЗ =о1+ о2; соШ « оз.сея() « "~п"; оЗ = о1; 1г(о1= оз) сонг « "о1 равно оз1п"; 1Г (о1>о2) сопя « "о1 > о21п"; ьг(о1<о2) сонг « "о1 < о2~п"; геспгп О; ГЛАВА T Повторение пройденного 1.
Нет. Перегрузка оператора просто увеличивает количество типов данных, с которыми оператор может работать, но не влияет на его исходные свойства. 2. Да. Не нужно перегружать операторы только для встроенных типов данных С++. 3. Нет, приоритет оператора изменить нельзя. Нет, нельзя изменить и число операндов. 4. ()1пс1и<(е <ьоятгеаю> ияьпд папеярасе яес(; с1аяя аггау ( ггпс пцтя (101' рпЬ11с: аг1 ау () Р Приложение В. Ответы нв вопросы и решения упражнений 555 уоЫ аег(з.пг п[10] ) з уоЫ тюзу(); аггау орегаЬога(аггау оЬ2); аггау орегааог-(аггау оЬ2); 1пЬ орегМог==(аггау оЬ2); аггауз:аггау() (гзГ 1 ) 1ог(з.