Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 78
Текст из файла (страница 78)
Синтаксис вызова функции, параметр которой передается по ссылке, идентичен синтаксису вызова функции, параметр которой передается по значению. 3. Аргумент по умолчанию, фактически, является компактной записью перегрузки функции, поскольку приводит к тому же результату. Например, инструкция >пс й~ъпе а, 1пг Ь = О) ю идентична следующим двум перегруженным функциям: 1пе Х ~1пе а); 1пе Г (~.пса, 1пе Ы Самоучитель С-н- 542 4. ()1ис1пс(е <1овегеат> ив) пя патекраее кМ; с)акк катр )пг а; риЫ)с: яагер() ( а = О; ) яагер(1ис п) ( а = пг )пг ОеЕ а() ( гегпгп а; ) )и( гааги ( ) ( катр оЬ (ОО) г катр оЬаггау(10) 5. Конструкторы копий необходимы, если программист хотел бы точно управлять процессом создания копий объекта.
Это важно только в том случае, если создаваемые по умолчанию поразрядные копии по каким-либо причинам нежелательны. ГЛАВА 6 Повторение пройденного 1. с1аяя гаус1авв ( 1ис х, у; рпЫз.с: жус1аяя (1пгг, гиг З) ( х = 1; У = З; ) аус1авя!) ( х = О; у = О; 2. с1аяв гаус1аяв ( 1пг х, у; рп)з11с: тус1авв (1ис 1 = О, гпс 1 = 0) ) т 3.
В объявлении функции после появления аргумента по умолчанию не должно быть обычных аргументов. Приложение В. Ответы нв вопросы и решения упражнений 543 4. Функции нельзя перегружать, если их отличие только в том, что одна получает параметр по значению, а вторая — по ссылке. (Компилятор не в состоянии их отличить.) 5. Аргументы по умолчанию лучше использовать тогда, когда можно с уверенностью предположить, что при работе приложения одно или более значений будут встречаться чаще других. Аргументы по умолчанию лучше не использовать, когда такой уверенности нет.
6. Нет, поскольку нельзя инициализировать динамический массив. В этом классе имеется только один конструктор, которому требуется инициализация. 7. Конструктор копий — это особый конструктор, который вызывается при инициализации одного объекта другим. Такая инициализация имеет место в следующих трех случаях: когда один объект явно используется для инициализации другого, когда объект передается в функцию в качестве параметра, и когда в качестве возврашаемого значения функции создается временный объект.
Упражнения 6.2 Перегрузка операторов * и у относительно класса соогс( (('..с'пг)е <1озггеак~> изуит пыкезрасе згс(; с1азз соогй тпГ х, у; 72 значения координат рпЬ11с: соогй!) ( х = О; у= О; соогс)(.'гА Ь, тпе 5) ( х = Г; у чоЫ дег ху(тпг а , 1пг а3) ( ) = х; 1 = у; ) соотг) орегаСог*(соогб оЬ2); соото орегаеогт'(соогс( оЬ2); /т Перегрузка оператора * относительно класса соогс( соотг соогс);:орегагог' (соогг(оЬ2) соогй етр; 'гор.х = х * оЬ2.х; Ьеп~р. у = у * оЬ2.у; ге игп Гел1р; Само)/чи тель / / Перегрузка оператора / относительно класса ссохла ссохла соогх)::орегагог/ (соогс)оЬ2) ( ссохла геп~г Ьешр.х = х / оЪ2.х; Ьетр.
у =- у / оЬ2. у; гегпгп лепр; 1пг тпагп () 1 ) о1 (1О, 1О), о2Д, З), З; 1пг х, у~ оЗ = о1 * о2г оЗ.дег ху(х, у) р сонг « "(о1 * о2) Х: " « х « ", у: « у « "'~п" у оЗ = о1 / о2; оЗ. пег ху (х, у) р сопп « "(о1 / о2) Х: " « х « ", У: « у « геспгп О; 2. 'Гак перегружать оператор % нежелательно, поскольку перегруженная версия оператора не связана с его традиционным использованием. 6.3 1. // Перегрузка операторов < и > относительно класса соогс) $1пс1пое <1оз1геат> азгпу папеврасе зЬг); с1азв соого ( 1пх х, у; // значения координат риЬ11с; соогх(() ( х = О; у= О; ) соохх((1пй 1, гпх З) ( х = 1; у = з; ) ~оЫяесху(1пС й1, пЙ зЗ) ( )=х; 3 =у; ) 1пг орегаЬог<(соогх( оЬ2)р 1пп орегаЬог>(соогх( оЬ2); // Перегрузка оператора < для класса соохб 1пь соотг)::орегасох<(соотг) оЬ2) 545 Приложение В.
Ответы нв вопросы и решения упражнений гегагп х<ОЬ2 х йа у<оЬ2 Перегрузка оператора > для класса соогс) 1пГ соог<(::орегаГог>(соотг оЬ2) ( ге"агп х>оЬ2.х йа у>оЬ2.у; упс вафп() ( соогб о1(1О, 1О), о2(5, 3) уй(о1>о2) соШ « "о1 > о2)п"; е1яе сопя « "о1 <= о2~п"; 1~(о1<о2) сопя << "о1 < о2~п"; е1яе соыс « "о1 >= о2 ~п"; гегпгп О; 6.4 1. // Перегрузка оператора -- относительно класса сооМ ()фпс1пбе <1оя~геав> пяфпс( патпеярасе яГс(; с1аяя соогс) упг х, у; // значения координат рпЬ11с: соогб () ( х = О; у= Ор соо с((1ПГ 1, пс О) ( х = 1~ у О~ ) чоЫ дег ху(фпг ау, фпг гО) ( 1 = х; 1 = у; ) соого орегаГог-- (); // префиксная форма соогс1 орегаког-- (1пЬ поГпяеб) ) // постфиксная форма Перегрузка префиксной формы оператора — для класса соогб соого соогс(::орега1ог--() ( х--' е гегягп *СЬ1ят // Перегрузка постфиксной формы оператора -- для класса соогс( соого соска:: орегаТог — (1пгпогпяеа) Самоучитель С++ х— у р гебигп *ТЬ1я; 1пбха1п () ( соотг о1(10, 10) р 1пб х, у~ объекта о1--; !! декремент о1.
оей ху (х, у); сон~ << " (о1 — ) Х: « х « , У: « у « ~п объекта — о1; /( декремент о1.се~ ху(х, у); сопб « "( — о1) Х: гебпгп О; 2. // Перегрузка оператора + относительно класса соогс) ()1пс1ис(е <1ояСтеазп> ияупо патеярасе яяб; с1аяя соогс( ( 1пб х, уу 1/ значения координат рпЬ11с: соогс(() ( х = О; у= О; ) соог<((1п~ 1, 1пб О) ( х = 1 у = 3 ° ) лоуб де~ ху(1пб й, 1пя аО) ( 1 = х; Э' соогс( орегабог+(соог<( оЬ2); // бинарный плюс соогс) орега~ог+(); !/ унарный плюс Перегрузка бинарного оператора т для класса соогс) соогй соотг)::среда~от+(соотг( оЬ2) соотг беюр; петр.х = х + оЬ2.х; петар.у =- у + оЬ2.у; /~ Перегрузка унарного оператора + для класса соогс( соогд соотг(::оретаСог+() Приложение В.
Ответы на вопросы и решения упражнений 1й (х<0) х = -х; 1г (у<0) гегигп *гЬ1я," 1г/е пафп () ( соотг) о1(10, 10), о2 (-2, -2) 1пп х, у; о1 = о1 + о2; // сложение о1*0ес ху(х, у) сопя « " (о1ж о2) Х: " « х « ", у: " « у « "'~п"; о2 = +о2; // абсолютное значение о2 .деГ ху(х, у); согп « "(+о2) Х; " « х « ", Ъ': '" « у « "М"; гегигп 0; 1. /* Перегрузка операторов — и / относительно класса соогс) с использованием дружественных функций ~К ()1пс1ис(е <1оаЬгеюп> паупер па~леярасе япсЬ с1аяя соотг 1пп х, у; // значения координат рпЬ11с: соотг(() ( х = О; у= О; сооЫ(1пп 1, 1пп з) ( х = 1 у гоЫ рея ху(1пЬ я1, 1п 60) ( 1 = х; З = У' ) Ы.епс) соотг орегапог-(соогб оЬ1, соотг( оЬ2); ггфепс( соотг) орегаГог/(соогб оЬ1, соотг( оЬ2); Перегрузка оператора — для класса соогп с использованием дружественной функции соогб орегагог-(соог<) оЬ1, соогб оЬ2) соотг) лепр; Ге~пр.х = ОЬ1.х — оЬ2.х; Самоучке кь Кедр.
у оЬ1. у — оЬ2. у; геОигп бекр; Перегрузка оператора ! для класса соотг) с использованием дружественной функции соого орекагок/ (соокс(оЬ1, соогб оЬ2) соогб гетр,х = оЬ1.х,' оЬ2.х; сешр. у = оЬ1.у ! оЬ2,у; ге1шп 1егпр; 1пг иауп ( ) ( соогс( о1 (10, 10), о2 (5, 3), оЗ; 1~А х, оЗ = о1 — о2; оЗ.цеК ху(х,у) ) соцб « "(о1 — о2) Х: «х« *', у: "«у<с "М"; оЗ = о1 ! о2; оЗ.деК ху(х, у); сопС « "(о1 1 о2) Х: «х « ", У: ' ° «у « "~п"; гесцгп 0; 2. ~! Перегрузка оператора * для операций оЬ*1пс и 1п~*оЬ ()1пс1нбе <1оягкеащ> ця1пд папеярасе згс(; с1азя соотг) ( 1пс х, у; !1 значения координат рпЬ11с: соок6() ( х = 0; у= 0; )(ж1, 1пО З) ( х = гол дее хУ(1пк а1, 1пб аЗ) ( 1 = х; З = У; Ы.епс) соогб орекагок* (ссор оЬ1, 1пс 1) > йгуепд соогб орекагок* (1пк 1, соотг( оЬ2) О Перегрузка огератора * первым способом соска орекагок* (сооко оЬ1, 1пб Приложение В.
Ответы на вопросы и решении упражнений соогб Гелр; гетпр.х = овг.х * 1; ген.у = оЬ1.у * геьпгп Ьежр; Перегрузка оператора * вторым способом соогб орегаеог' (ъпг 1, соога оЬ2) соотг( Ьешр; Гешр.х = оЬ2.х * оеар. у = оЬ2 .у * 1; гегнгп Ьешр; 1пг таъп() ( соогс( о1 (10, 10), о2) гпг х у; о2 = о1 * 2; 11 оЬ * гпс о2.де~ ху(х, у); сонь « "(о1* 2) х. ""<сх« ", у: « у сс "1п"; о2 =. 3 * о1; /1 1пб * оЬ о2.ЧеЕ ху (х, у) сонг « "(3 * о1) Х: "<сх« ", у; «у « "1п"; гебпгп Ор 3. Благодаря использованию дружественных оператор-функций„стало возможным получить, в качестве левого операнда, встроенный тип данных. При использовании функций-членов, левый операнд должен быть объектом класса, для которого определяется оператор. 4.
/* Перегрузка оператора — относительно класса соогс( с использованием дружественных функпий */ ()1пс1пг(е <1ояЕгеага> нягпо папеярасе яга; с1аяя соогс( ( 1пб х, у; // значения координат р ~11с: соотг(() ( х = О; у = О; 1 Самоучитель соотг)(1пг (, 1пт )) ( х тоЫ дев ху(1пг а1, 1пс префиксная форма тгфепс) соотг орегаЬог-- у =.)' яз) ( 1 =х: ~ =у) ) (соого( йоЬ) // постфиксная форма йгфепс( соогб орега".ог — (соогб аоЬ, фпг поГцяеб) Перегрузка префиксной формы оператора — для класса соогб с использованием дружественной функции соогб орегагог — (соогп' йоЬ) Перегрузка постфиксной формы оператора — для класса соогс( с использованием дружественной функции соого арегатог-- (соогб тоЬ, 1пб пояцяес)) объекта о1 « х « у " « у « "~п" гегигп О; б б оЬ.х --; оЬ.
у --; гесцгп оЬ; оЬ.х оЬ.у --; гститп оЬ; фпад та1п() соогс) о1 (10, 1О)," 1пг х, у; — о1; / / декремент о1. дег ху (х, у); сопя « "(--о1) Х: о1-- ) /! декремент о1. деГ ху (х, у); сонг « "(о1--) Х: 1. ))1пс1ибе <1ояГгеавт> ()1пс1пс)е <сяМ11Ь> цяфпд пап~еярасе ягс(; « х « ", у: " <с у с< "~п"р объекта о1 Приложение В. Ответы на вопросы и решения упражнений с1аьа с)упаггау ( шпС +р; пс етзе; риЬ1тс: ау у(тпг.
в); тпб арал(тпГ. т)) дог(тпг. т)с с(упаггау аорегаГог=(дупаггау аоЬ) // Конструктор бупаггау::г(упаггау(тпс в) ( р = пеи тпг. (а); тб(гр) сопл << "Ошибка выделения памяти~п"; ехт' (1) ) вгхе = в( l/ Запоминание элемента тпс аг)упаггау::рыб(тп дй (т<0 1 1 т>=зг хе) сопс « "Ошшибка нарушения границ массива !~п"; ахти (1); теспгп р ( т ) Получение элемента тпс с(упаггау:: деГ, (тпб т) ( тЕ(т<0 ) ) т>=втке) оопп « "Ошибка нарушения границ массива !~п"; ехтс(1)," геспгп р(т) Перегрузка оператора = для класса бупаггау булат ауйгс(ушаггау::орегаСог=(с(упаггауаоЬ) Сгмоучитель 552 Н (ауге!=оЬ. з1ге) ( сопл « "Нельзя копировать массивы разных размерсв ! ~п"; ех1т(1); азот(1=0; 1<ауге; 1++) р[1) = оЬ.р[1); теСцтп +тЬ1з; спв шауп () 1пс с1упаттау оЬ1 (10), оЬ2(10), оЬ3(100); оЬ1.рпв (3) — 10с 1 = оЬ1.деС(3); соцс « 1 « "1п"; ОЬ2 = оЪ1; 1 = оЬ2.оес(3) ) соцс « 1 « "~п"; Выполнение следующей инструкции ведет к ошибке оЬ1 = оь3; теецтп 0; 6.7 1.