Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 75
Текст из файла (страница 75)
Таким образом, такую память становится невозможно освободить, и наоборот, память, на которую в начале указывал указатель р объекта оЫ, при удалении этого объекта освобождается дважды, что может привести к повреждению системы динамического выделения памяти. 3. 1пг 11дЬЬ (р1апеЬ р) геспгп р.Яес пп1ея() / 18бООО; 5. // Загрузка алфавита в стек Ф1пс1пе(е <ьоясгеат> пятну пашеярасе яс<)7 ИеГ1пе Я1ЕЕ 27 Объявление класса яьас)г для символов с1аяя яласи сЬаг вЬск131ЕЕ); // содержит стек Тпс лояр // индекс вершина стека риЬ11с: аСас)<(); // конструктор яо1<( рияЬ (сЬаг сЬ); // помешает символ в стек сиаг рор(); // выталкивает символ из стека Инициализация стека власам:: ясаск() ( сопл « "Работа конструктора стека Самоучитель С+а ~<за = Ор т/ Запись символа в стек гоЫ яТас)~;:рая)з(сваг сЬ) ( 1й ("оя==Б1БЕ) сопй « "Стек полон ~п"; гевпгп; ) ягс)~(воя) = сп; сове+; Выталкивание символа из стека сваг ясас)г::рор() ( (воя==О) сопв « "Стек пуст ~п"; гесигп О; УУ возврат нуля при пустом стеке ) гоя--,' гесигп я~сЕ(воя); гофс) яЬоиявасЕ(ясас)<о) я1ас)< 1оаоя~ас)с(); фпг ша1п() явас)< я1; я1 = 1оас(атас)<() япомявас)г ( я1); гесигп О; Вывод на экран содержимого стека гофф яйоыяйас1(ягас)~ о) сваг с; когда выполнение этой инструкнжл завершится, стек о отОтстеет юИ1е(с=о.рор()) сопс <' с « "~п'*; сепг « "~п"; Загрузка стека символами алфавита ягас)г 1оа<)явясь() 509 Приложение В.
Ответы нв вопросы и решения упражнений згас(с г.; с(тат с; аког(с='а'; с<='к' > с+~-) с.рнзЬ(с) гесигп г; б. При передаче объекта функции в качестве аргумента и при возвращении объекта из функции в качестве возвращаемого значения, создается временный объект, который удаляется при завершении работы функции. При удалении временного объекта деструктор может удалить в программе нечто такое, что может еще пригодиться. 7. Дружественная функция — это функция, не являющаяся членом класса, но обеспечивающая доступ к закрытой части класса, для которого она дружественна. Еще раз, дружественная функция имеет доступ к закрытой части класса, для которого она дружественна, но не является членом этого класса. Проверка усвоения материала в целом 1.
// Загрузка алфавита в стек ()).пс1вг[е <хоагкеив> ()тпс1вс(е <сощуре> па[па пагпезрасе аеас[) ()с(ейтпе 512Е 27 // Объявление класса атас)г для символов с1аеа аГаск с1|аг вес)г[ЯтЕЕ); // содержит стек )пг коа; // индекс вершины стека риЫъс: аеас)г(); // конструктор уоЫ ривЬ[с)тат сй); // помещает символ в стек сваг рор(); // выталкивает символ из стека Инициализация стека аеаск:; егас)г() сонг « "Работа конструктора стека ~п"' кое =- Ог Закись о~кнвола в стек ~оЫ агасМ:: рваЬ (сЬас с)т) 510 Самоучитель С++ ~ й ==В1ЯВ) ( соШ « "стек полон 1п"; ) вт:.с)г('сов] = СЬ| ~ов++: Выталкивание символа из стека спал запас)с::рор() ( 1й (~оз==0) ( сон~ << "стек пуст 1п"; геСцгп О; // возврат нуля при пустом стеке йов —" гетцгп ввс)с (лов ); чоЫ вйоюз~асМ (з1асЫо) в(.ас1 1оас(зй ас)с (); влас)< 1оас(влас)<(1пг цррег) 1лг па1п ( ) ( ванек з1, в2, вЗ~ з1 = 1оабвгасЕ(); вЬоивгасМ(в1) ) /~ используется верхнлй регистр в2 = 1оаов1ас)с(1) ) вЬоывлас)г(в2); используется нижний регистр вЗ = 1оабзйасК(С) ) зйоъгв~ас)г(зЗ): ге~цгп О," Вывод на экран содержимого Стека чо16 вЬочз~асК (зсас)<о) СЬаг с; когда выполнение етой инструкции завертится, стек о опустеег ыЬ11в (с=о.рор ()) сонг « с « "~п"р Приложение В.
Ответы на вопросы и решения упражнений 511 сои~ << "~п"х Загрузка стека символами алфавита в(ас)< 1оа<)агасси(] ( влас)< 'с; сЬаг с; хог(с='а'; с<='х'; с++) Г.рнвЬ(с) ) гелигп г; /* Загрузка стека символами алфавита . Символахет верхнего регистра, если переменная даррел равна 1, в противном се~чае символами нижнего регистра */ влас)< 1оабвг.ас)~(хп~ лррег) ( ввас)< сЬаг с; 1~(пррег) с =- 'А'; е1ве с = 'а') аког(; йопррег (с) <='Е'; се-) ~ .риаЬ(с); гегпгп 2.
Ипс1пс(е <хов~геаха> ()хпс1ис(е <свСгхпо> ()хпс1пбе <свЫ1хЬ> нвхпд пахлеврасе вЫ; с1авв ьгггуре сЬах *р' хпт. 1еп; р Ь1хс: вжгтуре (сЬаг ~ркг); -ес.гафуре (); уоЫаЬом() ) ггхепй сЬаг ~9ег. всгхпЯ(асгсуре яОЬ) х вТг1уре:; в1г1уре (сЬаг*ргг) ( 1еп=аЬг1еп(ранг)) р (сЬаг ") хпа11ос(1еп+1) г 11(!р) Самоучитель сопл « "Свибка выделения паияти1п"; екал(1)р ) зьгсру(р, ргг) г злглуре:: -збгГуре() ( сопб « косвобождение памяти по адресу реп"; аггее(р); уоЫ згггуре:: зЬон() совс « р « *' — длина.
"" « 1епг сопс « сЬаг "деб я~Г1пд (ягггуре *оЬ) геспгп оЬ->р; 1пб ~патп() ( ясгсуре з1 ("это проверка") сЬаг ~з; з1,яЬох(); получение указателя на строку я = деВ з1г1пд(йз1); сопл « "Это строка, содержащаяся в объекте з1: "р сопс « я « "~п"; гегпгп О; 3. Итог эксперимента следующий: Да, если один объект производного класса присваивается другому, то данные базового класса также копируются. Далее приводится программа для демонстрации этого факта, ()ъпс1пбе <1озггеат> дягпд патеярасе зос(; с1аяя Ьаяе 1пс а7 риЬ11с: 5(3 Приложение В. Ответы на вопросы и решения упражнений чо1с( 1оаб а(впав п) ( а = п; ) (пс Чет.
а() ( гегцги а; с1аяя с)еттчесн рпЬ11с Ьаяе ( тпс Ь; рпЬ11с; лото 1оас) Ь ()пя и) ( Ь = и; ) тпя оеЬ Ь() ( кеяптп Ь; тпб тяаъп() ( с)еттчес( оЫ, оЬ2) оЬ1.1оас1 а(5)'> оЬ1. 1оас( Ь (10)," Объект оЫ тсрисваивается обьекту оЬ2 оЬ2 = оЬ1; сопя « "Это переменные а и Ь объекта ОЬ1: соуп « оЫ .дет. а() « ' ' « оы .дев ь() « ' хп '; сопя « "это переменнь.е а и Ь объекта оЬ2: сопя « оЬ2.деб а() « ' ' « оЬ2,дет Ь() « "~п"; /* Как вы, вероятно, догадались, выводимые на экран значения одинаковы для обоих объектов теяптп О; ГЛАВА 4 Повторение пройденного 1. При присваивании одного объекта другому объекту того же типа, текущие значения данных всех членов объекта, стоящего справа от оператора присваивания, передаются соответствующим членам объекта, стоящего слева от оператора присваивания.
2. При присваивании одного объекта другому, ошибка может случиться тогда, когда эта операция перезаписывает важные данные, уже существующие в целевом объекте. Например, если значение указателя на динамически выделенную область памяти или на открытый файл будет перезаписано, то очевидно, что тогда теряется исходное значение указателя. Самоучитель С++ 3. Если объект передается функции в качестве аргумента, создается его копия.
Однако конструктор копии не вызывается. Лри завершении работы функции, когда объект удаляется, вызывается деструктор копии. 4. Нарушение принципа независимости объекта и его копии при передаче параметра может возникать в нескольких ситуациях. Например, если деструктор освобождает динамическую память, тогда эта память для аргумента будет потеряна. В общем случае, если деструктор удаляет что-то, что требуется исходному аргументу, аргумент будет испорчен. 5.
$1пс1пс)е <1ояллеалг> пя1по патеярасе яло; с1аяя яглпглас1оп ( 1пс пглп; 1опр я:лп; // суммирование чисел ппгп рпЫ1с г чоЫ яее яплг(1пл и); чоЫ я)тон япгл() сопс « " сумма чисел " « пглл « " равна " « яглл « "1п", чо1с) яглгяла",1оп; ".яе~ яплг(1пп и) ( ппгп = и ялга = О; Йол(.=11 1<=в' 1+я) яиглласуоп паКе яглл~) ( 1пл яглепастоп сеглр; сопг « "Введите число: с1гг>> 1 легар.яел япглг1); лелптп лепр; 1псглатп ~) ( ягллпил1оп яг Приложение В. Ответы нв вопросы и решения упражнений 515 з = шаКе зжа() з,зЬон зим(); те(итп О; 6.
Для некоторых компиляторов требуется, чтобы во встраиваемых функциях не было циклов. 7. Фблс1ис(е <1ояСтеал.> ия1пя патпеярасе я(с(; с(аяя тус1азз ( 1пт пипи риЬ11с: таус1аяз(1п~ х) ( пип1 = хр (т1епс( 1пт 1зпед (л~ус1азз оЬ); 1п~ 1зпес (п~ус1азз оЬ) ( теиитп (оЬ.питп< О) ? 1: О; 1п~ п~а1п() ( пус1аяя а(-1), Ь(2) ' С « 1япеи(а) « ' ' « 1зпеЯ(Ь) соии « '~п ~еиитп О; 8. Да, дружественная функция может быть дружественной более чем одному классу. Упражнения 4.1 1. ((1пс1исе <1оз~сеата> ияупд палеярасе ясй,", с1аяя 1еииетя спат сЬ; Приложение В.
Ответы на вопросы и решении упражнений 51? 3. 'сс)пс1ибе <1озЬ гевал> пяппд пашеярасе яЫ; с1аяя 1епсегя ( сЬаг сЬ; рпЬ11с; 1еппегз(сЬагс) ( сЬ = с; ) сЬаг де1 сЬ() ( геспгп сЬ 1пп л~а1п () ( 1ессегя оЬ [10) = ( 1ессегя( 'а'), 1еггегя('Ь'), 1еЬЬЕгз('с'), 1еппегз('е(') 1ессегз( 'е), 1еППегя ('г'), 1епсегз ( 'д ' ) ° 1еппегз('Ь'), 1еСЬехз( '1'), 1еЬЬегз (') ' ) аког(1=0? 1<10; сопп « оЬ ( 1 ), де~ с)1 ( ) << сопя « геспсп О; 4.2 1. ?? Вывод содержимого массива в обратном порядке ()1пс1ие)е <1озпгеащ> пяупд паыеярасе явсз с1аяя яагер ( 1пп а, Ь; рпЬ11с: яагер(1пп и, 1пп а~) ( а = и; Ь = ац 1пь дев а() ( геспгп а; 1пп дев Ь() ( гегпгп Ь; ) Самоу пттель Сьь 528 ).пг вта1п() ! яатлр оЬ [4) яатпр ( 1, 2 ), яатлр (3, 4), яалтр (5, 6), р(), 8) ъпг тт *р; р = йоЬ[3)т // получение адреса последнего элемента массива сонг « "ттп"т гебпгп О т 2.
т'* Создание двумерчого массива объектов с доступом к элементам через указатель * т ))апс1в<)е <хоякгеалт> пяпд палтеярасе ябстт с1аяя яатлр ( 1п~ а; роЬ).зс: яатлр (гпс и) ( а = пт зпс дев а ( ) ( геспгп а; апг птаз.п( ) яатлр оЬ [4) [2) = ( 1> 2, 3, 4, 5, б, 7, 'тт пй гт Ко (а=От сопя сеттер Р г<4 т з.т-т) «р -> де'. а() « ' 'т « р -> деа Ь() « "т~п"т переход к преды)пщему объекту Лриложение В.