Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 74
Текст из файла (страница 74)
()1пс1ийе <1озггеап~> ()1пс1пйе <сзгг1пд> сс1пс1пс)е <свпй11Ь> пв1пд папеврасе згс; с1авв зйггуре [ сваг *р; 1пп 1епр рцЪ11с; згггуре (сваг *рсг) 1еп = зГг1еп(ргг) р р=(сваг *) тка11ос(1ег + 1) 1г ('р) ( сопс « "Окибка выделения памяти1п"; ехтс (1 ); Приложение В. Ответы нв вопросы и решения упражнений ястсру[р, реп); -яптпуре () ( сопс с< "Освобождение руп"; атее (р)," ) ноус( 5)1оы () соШ: « р <с ' — длина: " « 1еп; сопл « "1п"; 1пп ли1п! ) я~п~уре я1 ("Это проверка" ), я2("Мне нравится С~-~"); я1.
яЬон() я2.я)~он() песппп О; Проверка усвоения материала главы 2 1. Конструктор — это функция, которая вызывается при создании объекта. Деструктор — зто функция, которая вызывается при удалении объекта. 2, ()1пс1не)е <1оя1пекп> пяупд патеярасе япс(; с1аяя 11пе ( 1п' 1еп; рпо11с: 11пе(упс 1)," ) „. 11пе;:1(пе(ы~ 1) ( 1еп -- 1; 1пп 1ол(1=0; 1<1еп) 1++) сопл « '*'; 1пп л~а1п() 11пе 1(10) лепилп О; Самоучитель С++ 498 3.
10 1000000 -0.0009 4. ()1пс1иг(е <1оясгеап~? пягпд пажеярасе яЫ~ с1аяя агеа с1 рпЫьс: ЙопЫе ЬегдЬг; г(оиЫе юг)ЬЬ; с1аяя гесгапо1е: рпЬ11с агеа с1 ( рыЬ11с: гесЕапд1в (с(оиЫе Ь, г)опЫе и) ( ЬегдЬг Ь; х1г)гЬ = и; ) йопЫе агеа() ( ге пгп ЬегцЬг * иьг(гЬ; ) с1аяя гяоясе1ея: рпЬ11с агеа с1 ( рпЬ11с: 1яоясе1ея [с(опЫеЬ, г(оиЫе М ( ЬегдЬг = Ь; и1г(ЬЬ = и; ) йоиЫе агеа() ( гегигп 0.5 * Ье1дЬЬ * иЫЬЬ; ) с1аяя су11пг)ег: рпЬ11с агеа с1 ( рпЫьс: су11пс(ег (с)оиЫеЬ, оопЫе и) ( Ье1оЬг = Ь; иЫЬЬ = и; ) с(оиЫе агеа () ( гегпгп (2 * 3.141б * (и1с)ГЬ/2) * (юг)ПЬ/2) ) + (3.1418 * ЬегдЬЬ ~ ю1ЖЬ) 1 ) )пг па1п () гестапа1с Ы10.0, 5.0); (яоясс1ея 1(4.
О, б. 0); сунпс1сг с(3.0, 4.0) у сощ « "Прямоугольник: " «Ь.агеа() « "1п"; сонг « "Треугольник: " «1.агеа() « "1п'"; сои( « "Цилиндр: " « с.агеа() с< "1п'") геспгп 0; 5. Тело встраиваемой функции встраивается в программу. Это означает, что реально функция не вызывается, что позволяет избежать потерь производительности, связанных с вызовом функции и возвращением функцией своего Приложение В. Ответы нв вопросы и решения упражнений 499 значения. Преимуществом встраиваемых функций является увеличение скорости выполнения программы, а их недостатком — увеличение ее объема. б.
((1пс1пс(е <ъояттеав> пягпд патеярасе ясс(; с1аяя щ'с1аяя ( гп риЫ1с: тяУс1аяя(ъпс я, гпс у) ( 1 =- х) 3 = У; уоЫ япои() ( сопя « 1 « " " « 3; гпс жа1п() пус1аяя соппс(2, 3); соуп<.яЬои(); тесппп 0; 7. Члены класса по умолчанию являются закрытыми. Члены структуры — открытыми. 8. Да. Это определение анонимного объединения. Проверка усвоения материала в целом 1. () 1пс1ибе <1ояттаав> пятясь патяеярасе ясб; с1авя ртопрс гпп соппс; ри)о11с: ртовр1(спет ~я) ( сопя << я; стп >> соппс; ) -ртотре(); ртогпрт.::-рготрт.() ( тпс 1, аког(1 О; 1<соппт.) 1++) сопя « '~а' т Ко~(Э=О Л 32000- Э++); В .-уза Самоучитель С++ 500 )и( зяа1п() ргопрг оЬ( "Введите чисззо: ") геппгп 0; 2.
()1пс1пс(е <1ояпгеаззз> ияфпд тзалзеярасе ябс); с1аяя Ьсоз ( аопЬ1е бее(;з оопЬ1 е 1лсЬе я; риЬ11с; йгоф (г(опЬ1ей ): )' гпо1:: йпо1 (с(опЬ1е й) ( йеег 1псЬея = атее * 12; сопя « кеес « "фугоя равно " « 1псЬея « "доймем.'зп"; з пг.
лза з.п ( ) ( йгоз а (12.0), Ь(99.0) з геспгп 01 3. ()1пс1ззс(е <1ояСгеат> ()1пс1и<(е <сясй11Ь> ияфпд палзеярасе яга; с)аяя сБ.се ( 1пг ва1; рпЬ11с: чоЫ го11 () т гоЫ с)1се::го11() ча1 = (гапг)() Ъ б) з-1; // генерапия чисел от 1 ло б сопс « ча1 « "1п" з 1пп пзаз и О офсе опе, сзчо; Приложение В. Ответы на вопросы и решения упражнений опе.ко11(1; кио.ко11(1~ опе.ко11(); Сио.ко111); опе.ко11(]; кио.ко11(); геСигп 0; ГЛАВА 3 Повторение пройденного 1.
Конструктор называется ттЫр10, а деструктор - аЫр10. 2. Конструктор вызывается при создании объекта (т. е., когда объект начинает существовать). Деструктор вызывается при удалении объекта. 3. с1авв мага: рпЬ11о р1апег ( /у 4. Функцию можно сделать встраиваемой, если перед ее определением поставить спецификатор 1в11пе, или если ее определение разместить внутри объявления класса. 5. Встраиваемая функция должна быть определена перед ее первым использованием. В ней не должно быть циклов. Она не должна быть рекурсивной. В ней не может быть инструкций яо1о и виз1сЬ. И наконец, она не должна содержать статических переменных.
6. загпр1е оЬ(100„'Х'1; Упражнения 1. Инструкция присваивания х = у неправильна, поскольку с11 и е12 — это два разных класса, а объекты разных типов присваивать нельзя. 2. 111пс1ис(е <1оеккеат> пзъпо пагпезрасе вгб; Мей1пе ЯХЕ 100 Самоучитель 502 с1аяя Я,сУРе ( Епс с)цеце (31ЕЕ); // содержит очередь 1п Ьеаб, а11; // индексы верщины и хвоста рпЬ11с: с( 1уре(); // конструктор чо1Й я(1п~ п1лп) / // запоминание 1пс с(ес((): // удаление из начала очереди )) Конструктор с( Туре::с) Суре() Ьеаб — Па11 = О; Помещение значения в очередь уо16 с( ~уре:;с)(1пС пшп) 11 (Па11 + 1==Ьеас( ( ) (СаЫ + 1==31ЕЕ ЯБ !Ьеас() ~ ( сопп « "Очередь потна"; геспгпу ) са11++) Ы(Са11=-31ЕЕ) са11 = О; // круговой цикл с(пепе )са11) = пцтп; Выталкивание значения из очереди 1пс с) суре::с(ес(() ( Ей (Ьеас)==~а11) ( сопс « "Очередь пуста"; геспгп О; Ьеас)++; 1Е (Ьеаб- 31ЕЕ) Ьеаб = О; // круговой цикл геппгп с)пепе(Ьеас(); 1пв тпа1п() с( ~ура С(1, П2; 1пс 1) Гоп(1=1) 1<=10> 1~-+) ( с(1.
с) (1); ) // присваивание одного объекта очередь — другому с(2 с(1; Приложение В. Ответы на вопросы и решения упражнений 60Э // демонстрация того факта, // что обе очереди имеют одинаковое содержимое йот(з'. 1; 1<=10; з.++) соиТ « "Элемент очереди 1: " « с(1 . бес(( ) « "~п"т Гол(1=1; 1<-10; сопя « "Элемент очереди 2: " « с(2.с)ес() « "~п"; тесл п О; 3. Если для хранения очереди память выделяется динамически, тогда, после присваивания одной очереди другой, когда объекты удаляются, для очереди, стоящей в инструкции присваивания слева, память освобождена не будет, а для очереди, стоящей в инструкции присваивания справа, память будет освобождена дважды. Оба этих условия неприемлемы, что и вызывает ошибку.
з.г 1. $1пс1пбе <Еозстеат> пягпс патпеярасе яЫ; СпбеГгпе ЯТЕК 10 Объявлевлле класса ясас)< для символов с1аяя ясас)~ ( с)так зсс)с[Я1ЕЕ); /т содержит стек гпс соз; уу индекс вершины стека рп)з11с: апаса (); 1! конструктор чоЫ риз)1 (сЬак с)т); ту помещает символ в стек сцак рор (); тт выталкивает символ из стека Итлтциализацил стека ясаск::ясас)'.() сопл « "Работа конструктора стека ~п"; соя =. 0; / / Помещение символа в стек чоЫ зСаск::рпзп(сйак сЫ 1 Г (Поя==ЯтуЕ) ( сопя « "Стек полон ~п"," текптп; 504 Самоучителя С++ зсс)т[тоя) = сЬ) соя++; Выталкивание сиьжола из стека сиат ясасЕ::рор() з т (тзоз.=О) [ сонг « "Стек пуст опчу тетптп О; // возврат нуля при пустом стеке тоз —; тесптп зтсК[еоз); ыоЫ зЬоызТас1(зтаск о) зпт аъзап() Г 1 атас).
я1; 1п я1. рияЬ ( ' а ' ); я1.ризЬ('Ь')) я1.рпзЬ( с ), зЬоызтасЕ(я1); объект я1 в Функции паап() по-прежнему существует соШ « "Стек з1 все маце содержит следуюжее: ~п": Гот(1=0/ 1<ЗА 1++) соит « я1.рор() « "~п") тесптп О; Вывод содержимого стека уоус) зЬоиятаск(ясаск о) ( сЬат сг когда выполнение этой инструкции завержится, стек о опустеет иЬ11е(с-о.рор()) сост « с « "'и*'; соШ « "~п") Эта программа выводит на экран следуюшее: Работа конструктора стека с Ь а Приложение В. Ответы на вопросы и решения упражнений Стек пуст Стек в1 все еще содержит следующее: 2, Память для хранения целого, на которую указывает указатель р в объекте о, который используется при вызове функции веко, освобождается, когда при завершении функцией пеяо своей работы копия объекта о удаляется; однако эта память все еще необходима для объекта о в функции в)а1в('1, з.з 1, ((1пс1и<)е <ьовТкеаж> ив)пя патпекрасе к1д; с1авв уу)то 1 онат паже; рп)Ы1с: и)ло (спал с) ( соус « "Создание объекта и)ло сс"; соса « пате « "~п"; ) -и(лп() ( соис « "удаление объекта и)ло Ф" « паже « "~п"; иле жаКеийо () и'по сежр ( ' В ' ); телптп ветр; тпл жа1п() и"по оЬ('А') жа)<вайо (); тесптп От 2.
Имеется несколько ситуаций, в которых возвращать объект было бы неправильно. Вот одна из таких ситуаций: если при создании объекта файл открывается, а при удалении объекта файл закрывается, тогда к закрытию файла приведет удаление временного объекта, которое происходит, когда функция возвращает объект.
Самоучитель С++ 3.4 1. ()1пс1цс(е <1озггеатп> ыя1пд папеярасе ясй; с1аяя рг2) // предварительное объявление с1аяя рг1 Тпс ргупсупд; // рыЫ1с: рг1() ( рггпс1пд = О; УоЫ зеГ рг1пГ(1пг. ясасыя) ( ргзпсупд = ябаспя; ) // Жепе 1пб 1пызе(рг1 о1, рг2 о2); с1аяя рг2 Тпс ргзпсупд; // риЬ11с: рг2() ( ргупсупд = О) ) чоуо зеГ ргзпГ (1пс звался) ( ргупвгпд явавпя; // йгуепй гпг 1пвзе(рг1 о1, рг2 о2); Возвращает истинУ при занятом принтере 1пб 1пызе(рг1 о1, рг2 о2) ( 11 (о1. ргзпГ1пд ( т 02. рг1пс1пд) гесыгп 1; е)яе гегпгп О; Тпс ща1п() ( рг1 р1; рг2 р2р Ы(!1ппзе(р1, р2) ) сопс « "принтер свободен~а" р соп « "установка для печати принтера р1 ...~п"; р1.зеГ рг1пГ (1)) 1й(1пизе(р1, р2)) соус « "теперь принтер занят~а"1 сопя « ьдткточевие принтера р1 ...
~п"; р1.зеГ, рг1пГ [0); Ы (! 1гпазе (р1, р2) ) соус « "принтер свободен1п"; Приложение З. Ответы на вопросы и решения упражнений соп( « "Подключение принтера р2 ... '~п"; р2.яес ргьпЬ(1); 1Е(ьппве (р1, р2) ) соп". « "теперь принтер занят~в") гегигп О; Проверка усвоения материала главы 3 1. Для того чтобы присвоить один объект другому, необходимо, чтобы тип обоих объектов был одинаков. 2. Присваивать оЫ и ОЬ2 неправильно, так как память, на которую в начале указывал указатель р объекта оЬ2, теряется, поскольку это значение указателя р при присваивании переписывается.