Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 77
Текст из файла (страница 77)
Ответы на вопросы и решения упражнений уотс( а тормасов:: я~ор () ( епс) — (ооцо1е) с1ос)< О / СьОСКЗ РЕК ЯЕС; ) уоЫ асориасс)т::Явой О соус « истекшее время: " « епа — Ьедтп; .сов~ << "Ы"; 'пс спаъпО яъорма сомашсп; ).Опс маесЬ.аеагв(); Еог(1=0; 1<3200000/ 1+~.); // время цикла иаЕс)т.асор О; иаеоп. алом О; Создание объекта с использованием его начального значения ясориагсЬ я2(с1оск()); яог ( 1=0 ' 1<250000 / 1++);,'/ время цикла я2.явор(); я2.ябои(); гебвгп 0; 5.2 1. Для объектов оЦ и 1етр вызывается обычный конструктор. Однако, когда объект 1ев)р становится возвращаемым значением функции (9, создается временный объект, который генерирует вызов конструктора копий.
() ъпс1в<)е <1оветеапо цяапс паптеврасе явс); с1аяв гпус1аав рцп11с: пзус1аяа(); тус1аяв (сопя п1ус1аяя ао) п1ус1аяя Е (); // Обычный конструктор 534 Самоучитель С++ гнус)азз::пус1аяз () ( соп( « "Работа обычного конструктораХп" // Конструктор копий гпус1азгк ".вус1азя (сопя1 гпус1аяз йо) ( соек « "Работа конструктора копий~в"; Возвращение объекта 1тус1аяя п1ус1аяя::1() ( пус)аяя гещр; егнтп кетпр; тпг па1п ( ) ( щус1аяя оЬз оЬ3=оЬЗ . т (); гегнтт. О ) 2. В соответствии с программой, когда объект передается в функцию яе!та!(), создается его поразрядная копия. Когда функция яе(уа)О возврашает свое значение и копия удаляется, выделенная для этого объекта память (на которую указывает указатель р) освобождается.
Однако эта память по-прежнему требуется исходному объекту, который использовался при вызове функции де!уа!9. Далее представлена исправленная версия программы. Для решения проблемы потребовался конструктор копий. // Исправленная версия программы ()1пс1не)е <ьояйтеатв> 41пс1псе <сяЫ)1Ь> пя)пв патпеярасе я(о; с1азз гнус)азз ( (п1 +р; рпЬ11с: таус1аяз(ьпс 1); щус1аяя(сопев птус1аяя Во); // конструктор копий -п~ус1азя() (с(е1еке р;) Ет1епа (п1 дееуа1(тус1аяя о); Приложение В. Ответы на вопросы и решения упражнений 535 гаус1авв::нус1авв(1пь О 1 р=пен 1пб; 1т(!р) ( сопс « "Скибка выделения памяти~п"; ехз.Ь (1) у ) *р=1; l/ Конструктор копий таус1авв: ."аус1аав (сонат тус1аза Ао) р=пеи 1пгп УУ выделение памяти для копии 15('Р) ( соцс « "Опплбка выделения памяти~п"; ех1с(1); 1гп атее та1 (п|ус1авв о) гесцгп *о.р; уу получение значения 1пс дзЫО пус1авв а (1), Ь (2) ) сопс «де~ча1 (а) « " " << де~уа1 (Ь); сопл « М' ~ сопс «деСуа1 (а) « " " « цесуа1 (Ь); гетигп 0; 3.
Конструктор копий вызывается, когда один объект используется для инициализации другого. Обычный конструктор вызывается, когда объект созда- ется. 5.4 1. ()1пс1пйе <1ОВСкеат> Фупс1пс(е <свсо11Ь> 536 Самоучитель С++ нятпд папеярасе ясб; 1опд жувТгло1(сопвс сЬаг *я, сЬаг **епй, гпл Ьаяе = 10) гебнгп вттго1(в, епс(, Ьаве); гпГ. пагп () 1опд х; спал я1 — "100234"; сЬаг *р; х = тувсгТо1(в1, йр, 16); сонс « "Основание системы счисления 1б: " « х « '~г.'р х — тувегео1(в1, ар, 10); сонс « "Основание системы счисления 10: "' « х « ' 1г.'; х = гаувсгЬо1(в1, йр); // основание системы счисления, заданное по умолчанию соне « "Основание системы счисления по умолчанию 10: « х « '~п'~ геснгп 0; 2.
Все параметры, которые получают аргументы по умолчанию, должны находиться правее параметров, которые этих аргументов не получают. Таким образом, после того как вы начали присваивать значения аргументам по умолчанию, все последующие параметры также должны получать свои значения по умолчанию. Что касается приведенного в вопросе прототипа функции, то в нем параметр (1 значения по умолчанию не получает. 3. Поскольку функции управления позиционированием курсора у различных компиляторов и сред программирования разные, показано только одно из возможных решений задачи. Следующая программа предназначена для работы в среде программирования Вог1апд С++.
/* Эта программа работает только в среде программирования Всг1апе) С++ Э/ ((1пс1нбе <говсюеалт> ()тпс1нбе <сопго.Ь> нягпд паюеярасе ясс(; уоЫ тус1гео1((пт 1еп = -1) 1пг ваап ( ) 1пт 1' Припожевые В. Ответы на вопросы и решения упражнений оокоху(1, 1); Гок(1=0; 1<24; сонс « "аЬсбейяЬтзЕ1ппор<(кз1пчихук12345878ЭОМ"; доеоху(1, 2); л~ус1кео1 () р докоху(1, 4); тус1кео1 (20]; келнкп 0; ) Стирание строки на величину, задан:пю параметром 1еп лото тпус1кео1 (1пв 1еп) тпс х, у; х = иЬекех()г у = иЬекеу()," получение положения по х получение положения по у 1Е(1еп == -1) 1еп = 80 — х; тпк 1 =х кок(; 1<=1еп; 1++) сенс « докоху(х, у); // установка курсора 5.6 () 1пс1 и<(е <1овккеав~> нвтпс паспеврасе вЫ; 1пк б1л(1пс а, 1пл Ь) келнкп а — Ь; 11оак С)ай(Г1ОаК а, 81оас Ь) кекпкп а — Ь; тпк патп() ( тпс (+р1) (1пК, 1пК); 4.
Аргумент по умолчанию не может быть другим параметром или локальной переменной. 535 Самоучитель с~ ° 11оаг (*р2) (т1оаС„С1оаС); р1 = б15; // адрес функции б1г(1пс, 1гс) р2 †' ЙСС; // адрес функции б1С'(~1оаС, 11оаг) сопс « р1 (10, 5) « соц. « р2(10.5, 8.9) « '1п'; ге цгп 0; Проверка усвоения материала главы 5 1. // Перегрузка конструктора баСе() для параметра типа Сфве ()1пс1цбе <СояСсеав> ()Спс1пбе <сяСб1о> // заголовок включен длн функции яясапС(' ()Спс1пбе <сС1ве> цяфпд павеярасе ясб; с1аяя баге ( 1гс бау, и'опС)1, уеаг; рц)з11с: баСе (сЬаг*яСх); басе (Спг в, 1пг б, 1пС у) бау = б; вопСЬ = т; уеаг = у Перегрузка конструктора длн параметра типа С1ве С баСе(С1ве С С); Сб яЬо (1 сонг « вопСЬ. « '/' « бау « '/' соцс « уеаг « ''и'; баСе:: баСе (сЬаг *ясг) яясапС (яСг, "$Л*сЫ%*сЫ", йфвопСЬ, йбау, йуеаг); баСе;: баСе (С1ве С С ) Г я гцсг СВ *р; р =- 1оса1ССве (аС); бау = р -> Св вбау; твоам = р -> Св воп; Приложение В.
Ответы нв вопросы и решения упражнений усат = р -> дтл уеатт 1п1 тати() ( Образование даты с помощью строки бабе вба);е("11/1/92") ) Образование даты с помощью трех целых баке З.баье(11, 1, 92); /* Образование дать с помощью параметра типа съа~е ь, нто ведет к созданию объекта, использующего систеьлтую дату "ьт баке ЕбаКе (акте(ИШ Ь) ) вбасе.знои(); 1баке.знои(); ебаке.впои(); тесвтп О; 2.
В классе ыпр определен только один конструктор — конструктор с параметром. Поэтому нельзя объявлять объект типа вашр без параметра. (То есть инструкция катр х — это неправильное объявление.) 3. Первый довод в пользу перегрузки конструктора состоит в том, что такая перегрузка обеспечивает гибкость, позволяя вам выбрать в каждом конкретном случае наиболее подходящий конструктор.
Другой довод в том, что перегрузка позволяет объявлять как инициализируемые, так и не инициализируемые объекты. Вам может потребоваться перегрузить конструктор для динамического выделения памяти под массив. 4. Ниже представлена основная форма конструктора копий: имя класса (сопз( ими класса аобтвжт) ( тело конструктора ) 5. Конструктор копий вызывается, когда имеет место инициализация, а именно: когда один объект явно используется для инициализации другого, когда объект передается в функцию в качестве параметра, когда создается временный объект при возвращении объекта функцией.
6. Ключевое слово обжег(оай является устаревшим. В ранних версиях С++ оно информировало компилятор о том, что функция будет перегружена. В современных компиляторах это ключевое слово не поддерживается. 540 Самоучитель С++ 7.
Аргумент по умолчанию — это значение, которое присваивается параметру функции при ее вызове, если при этом соответствую1дий аргумент функции не указан. 8. ()1пс1нс(е <1озггеап~> ((ьпо1пое <сзГг1пд> цв(пя патекрасе зЫ) чоЫ гечегзе (сваг 'згг, 1п1 сопит = о) 1п( та1п () сваг *в1 = "Это проверка"; с)1аг *в2 = "Мне нравится С++"; гечегзе (з1); 1! Реверс всей строки гечегзе (з2, 7); 1! Реверс первых семи знаков соог « з1 « '~п'1 сопГ сс В2 « 'Хп'; геГпгп 0; чоЫ гечегзе (сваг *вгг, 1пГ соппг) ( 1пг с)1а г Г впар; 1г!!соппс) соопг = втг)еп(з|г) — 1; гог(1=0„2=соппг1 1<д.; ' ~ ~, 1--) ( гетр = згг( ( зяг( 1 1 = згг( З 1; з1г[ ) 1 - (етр; 9. Все параметры, получаюшие аргументы по умолчанию, должны находиться правее параметров„не получающих таких аргументов.
10. Неоднозначность может возникнуть, когда по умолчанию происходит преобразование типа, а также при использовании параметра-ссылки или аргумента по умолчанию. 11. Пример неоднозначен, поскольку компилятор не может определить, какую версию функции соипрМеО следует вызвать. Вызвать ли первую версию с аргументом по умолчанию Йч(вог, или вторую — в которой функция получает только один параметр? Приложение В. Ответы нв вопросы и решения упражнений 541 12. При получении адреса перегруженной функции с помощью указателя, конкретную ее версию определяет способ объявления указателя. То есть для всех перегруженных версий функции, адреса которых мы хотели бы получить, должна объявляться своя версия указателя. Проверка усвоения материала в целом 1, Мьпс1пбе <ъовЕтеап~> натпо патпеарасе вЕб; тоЫ стает~гас аа, тпе т1Ь) тп 1Й (а<Ь~ теснота; е1ае ( // а и Ь меняются местами =- а; а=Ь; Ь = ьпь та1п П тпрр х = 10, у = 5; сонс « "х: "«х« " у: "«у« отбею ~х, у) сои' « "х: "«х« ">у: "«у« ' ~п' теснота От 2.