Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 76
Текст из файла (страница 76)
Ответы на вопросы и решения упражнений 5 (9 яагер "р; р = (иматр *) о(з; аког(1=0; 1<4; сопх « р->деХ а() « Р++; соп1 « р->деЬ а() « "~п"; Р++', сои( « "'~п"; теЬлп ()т 4.3 1. // Использование указателя лЬ1я $1пс1ис(е <1ояХ.хевтп> пя1пд павеврасе явс(; с1аяя тус1аяя ( 1пл а, Ь; рпЬ11с. тус1аяв (Ы п, 1пл в) ( лМя->а = и; ль1я — >ь = тк; 1пь- аИ О ( хелпхп ьЬ1я->а + ~Ь1я->Ьт ) уоЫ яЬои(); уо1о пьус1аяя::яЬоы() ( 1пв 'ь = ТЬ1я->ах(х((); // вызов $ункпии-члена сапа « в «"'~п"; 1пл п~а1п() ( тус1аяя оЬ(10, 14); оЬ,яаоы(); хек тхп О; 520 Самоучитель С-ьч- 4.4 ссшс)лйе <1оят.геев> паунд патпеярасе ясй; з.пС па1п() а1оап *~) 1опд *1; сЬап *с; 1 = пеи я1оа1; 1 пех 1опд; с = петю сЬах; з.й (~( ) ) ' т ; с) сопя « "отрубка выделения памяти,' "есина 1; *й . 10.102р *1 = 100000; *с = 'А'' сопс «*й« ' ' « *1 « ' ' « "ср сосв « '~п') йе1еСе й; йе1епе 1; йе1еСе с; тесптп О) 2.
()1пс1ибе <1оя~геап> ()1пс1пйе <ся~т.упд> пяупд патпеярасе яяй; с1аяя рЬопе ( сЬат патяе[40]т сЬаг пшпЬеп(14)," рпЬ11с: чоуй яЬопе(сЬап «и, сЬат пан) чойй яЬою(); )т чоуй рЬопе::я~оге(сЬат *и, сЬат *аппп) ( яЬпсру (пале, и) ) яЬхсру (питЬег, лна) Приложение В. Ответы нв вопросы и решения упражнений 52( чоЫ рпопе:: еЛоиО ( соус « пате « ": " «п~леЬегр сощ « "~п"; 1пг гав 1п () рпопе +рг р = пеж р)топе; 1Г('р) ( сонг « "Ошибка выделения памяти."; гете го 1; р->асоге ( "Исаак Ньютон", "111 555-2322" ); р->аарон( ); с)е1еге р; геснгл 0: 3.
В случае неудачной попытки выделения памяти, оператор пеи может либо возвратить нулевой указатель, либо возбудить исключительную ситуацию. Чтобы выяснить, какой механизм используется в вашем компиляторе, необходимо просмотреть соответствующую техническую документацию. В соответствии с требованиями стандарта по С++, оператор пен по умолчанию возбуждает исключительную ситуацию. 4.5 1. сваг *р; р = лех с)тат[100): О ....
есгсру(р, "Это проверка" ); 2. Фвпс1пг1е <воаЕгеап» петли пагаеврасе аЫ; 1лв гпа3.п() Йоьб1е +р; ,р = леж доп)ате(-123.0987)у Самоучитель С+~ сопс « *р « ''и'р лесптп 0; 4.б 1. Нпс1Ме <1оеЕкеал~> инула петеврасе в~с(; чоЫ лпеа(упв а1)г !! версия функции со ссылкой чоЫ рпее(ьпс *1); !! версия функции с указателем 1пс п~афп () фпв 1 = 10; 1пв ч' =- 20; тпед 01) ' рпеЧ(лЭ); сопс « 1 « ~ « 1 « '~п'р ле'сввп 0; // использование параметра-ссыпки чоЫ гиен((п1 аф) — 1; ~! использование параметре-указателя 'ар ч(фпад *1) *1 — *1 2. При вызове функции тпр)еО адрес й получен явно, посредством оператора й. Это ненужно и неправильно. При использовании ссылки в качестве параметра перед аргументом не ставится оператор &.
3. Адрес параметра-ссылки передается в функцию автоматически. Для получения адреса нет необходимости производить какие бы то ни было действия. Передача по ссылке быстрее, чем передача по значению. При передаче по ссылке не делается копии аргумента и поэтому не бывает сторонних эффектов„связанных с вызовом деструктора копии. 523 Приложение В. Ответы на вопросы и решения упражнений 4.7 1. В исходной программе объект передается в функцию ввожу по значению. Поэтому делается его копия. Когда функция в1гоио возвращает свое значение, копия удаляется и при этом вызывается деструктор копии. Это приводит к освобождению памяти, на которую указывает указатель р, но освобожденная память все егце необходима аргументам функции Йоту(). Здесь представлена правильная версия программы, в которой, для того чтобы предотвратить появление копии при вызове функции, в качестве параметра используется ссылка: // Теперь программа исправлена ((1пс1ис(е <1оя спеет> ((1пс1псе <сятг(пя> ((1пс1псе <сяМ)(Ь> ця(пя паптеярасе яга; с1аяв ясгпуре ( сЬаг 'р; роЬ11с; ялюлуре(спал 'я); -ясгсуре () ( с(е1есе () р; сЬаг *дет () ( гесигп р; ) яСг~уре.": ятюсуре (сЬаг *я) 1пг 1; 1 = я г1еп(я) + 1; р = пеи сЬаг (1]; 1~ (!р) ( сопб <С "Овибка выделения памяти'~,п"; ех1т(1); ясгсру(р, я) Проблема режена с помощью параметра-ссьлки лоЫ ябои(яегсуре ях) ( сЬаг *я; я = х.дег.
(); соцб « я « "~п",* 1п' жа1п() ( япгпуре а (" Привет" ), Ь ("Ъ~есь") Самоучитель С+ч. з)ию(а) > знои (Ь); те1итп О; 1. // Пример защил(енного двумерного массива ()1пс1п<)е <1озСгеаш> 1пс1пс)е<сясс)11Ь> пяупд пашеярасе зСй с1аяя аггау 1пс 1яуге, звуке; 1пс +р: рпЬ11с: аггау (1пс 1, 1пс ~); 1ПСарпС(зпС 1, 1пС ]); 1пС деС (1пС 1, 1шС 3)' ); аггау.": актау (1пс 1, гпс 1) р = пех 1пс [ 1 * з ) 1С()р) соиС « "Ошибка выделения памятия"; ех1с (1); 1яуге = 1; дяуее У // Запись значения в массив )п1 Лаггау::риС (5пС1, (пв Л) й(1<0 ! ) 1>=1я1ке( ~ з<0 1 1]>=1з1ке) соцс « "Ошибка, нарушены границы массива! !! 1п"; ехус(1) ~ геспгп р[1 * 3яузе + )]з // возврат ссылки на р[ // Получение значения из массива 1пС аггау::аеС(1пС 1, 'пС 3) 1К(1<0 ( ) 1>=1яузе 1 1 1<0 1 1 л>-лз1зе) соцс « "Ошибка, нарушены границы массива! ! !М"~ ех1с (1); Приложение В, Ответы нв вопросы и решения упражнений гегцгп р[1 * )Мхе + 1); // возврат символа 525 аког ( 1=0 у 1<2; 1++) Гог()=0; 3<3; )++) а.рис(1, 3) аког(1 0; (<2; 1++) Гог (3=0; з<3г )+~-) сон( « а.цеЬ(1, 3) « 'г // генерация ошибки нарушения границ массива а, рис (10, 10); гегнгп 0; 2.
Нет. Возвращаемую функцией ссылку нельзя присвоить указателю. Проверка усвоения материала главы 4 1. ()1пс1цс)е <1оеггеат> цетпд пагаеерасе асо; с1аее а Суре ( с(онЬ1е а, Ь| роЬ11с: ,а суре(с(ооЬ1е х, сонЬ1е у) а=-х; Ь=у; ~~отс) еЬои() ( сонг << а << ' ' << Ь << "~п' г ) 1пг. ва1п() ( )пг п1а1п () агтау а(2, 3) ! (пг 1 3 а суре оЬ(2) (5] а еуре(1, 1), а Туре(3, 3), а суре(5, 5), а СурЕ(7, 7), а уре(9, 9), а суре(2, 2), а суре (4, 4), а Суре(6, 6), а еуре(в, 8), а 1уре (10, 10) Приложение В Ответы на вопросы и решения упражнений :3.
Указатель 1Ыв — это указатель, который автоматически передается функции- члену и который указывает на объект, вызвавший функцию. 4. Основными формами операторов пев и йе1е1е являются следуюшие: р-чае — печг буре; с1е1еге р-гат"; При использовании оператора пе» нет необходимости в приведении типов. Размер объекта определяется автоматически, поэтому не нужен оператор жеев.
Кроме этого, незачем включать в программу заголовок <сМЙЬ>. 5. Ссылка по сушеству является скрытым константным указателем и просто играет роль другого имени переменной или аргумента. Преимушество от использования параметра-ссылки в том, что никакой копии аргумента не делается. б. й.тнс1ц.бе <1оясгеаш> вяуно вапеярасе ябс); чей гес1р 1с)оиЬ1е ао); 1в таъл() с)онЬ1е х = 1ОО.О; Гоас « х равнО « х « ~,и '; лесур )х); сов" « "Обратная величина равна " « х « '~в' геГвтл О; чоЫ гес)р ',с)овЬ1е ас)) д = 1/с$; Проверка усвоения материала в целом 1.
Для доступа к члену объекта с помошью указателя используется оператор стрелка 1->). 2, $1вс1вде <ъояггеав> Фъпс1вбе <сягг)пя> 111пс1ис)е <сятс111Ь> ия)пя пагпеярасе ягс1; Самоучитель С++ с1авв з1гсуре ( с)заг *р; 1п( 1еп; ри)з11с: зггсуре(с)заг "ргг): -зггГуре (); уоЫ з)тои(); зсгйуре:: згггуре (сваг "рог) ( )еп = згг)еп(ргг); р = печу сваг(1еп + 1); э'.г (! р) сои( « "Ошибка выделения памяти~в"; ек1г (1); зггсру(р, ргг); зггсуре::-зсггуре () ) совс « "Освобождение памяти по адресу р~п"; ае1еье () Р уотб зт.гяуре::з)зоиО сове « р « " — длина: " « 1еп; сонг « "~п"г 1пс п~атп() ( яьгсуре з1 ("Это проверка" ), з2 ("мне нравится счч-"); з1.
знои ~ ) ) з2. з)тои ( ~ ~ те вгп ОГ ГЛАВА 5 Повторение пройденного 1. Ссылка — зто особый тип указателя, который разымсновывается автоматически. Ссылка в инструкциях может использоваться точно так же, как обьект, 529 Приложение В. Ответы на вопросы ирешенив упражнений на который она указывает. Имеются три вида ссылок: ссылка может быть параметром, ссылка может быть возвращаемым значением функции и, кроме этого, ссылка может быть независимой. Самыми важными являются ссылка в качестве параметра и ссылка в качестве возвращаемого значения функции. 2. Фтпс1абе сьоятгем> пя1па пагпеярасе ягн; 1пг па1п 11 1 Поаг гпт *1; Г= пса йоаг; = пеа 1пг; 1 й' ~ ! г ~ ! !1) соит.
сс "Ошибка выделения памити1п"; гетцгп 1; *~ = 10.101; "1 = 100; сонг <с *й с« ' ' с "1 « ' ~п'; с1е1есе Г; йе1есе . есата О; 3. Здесь показана основная форма оператора пев, используемая для инициализации динамических переменных: уиевееелв ни перененнуи = пеи аип1иницивлиеируезвее виаиеиие) Например, .в следуюшем фрагменте выделяется память для целого и этому целому присваивается значение 10: 1п1 ~р; р = пев 1пе.1101; 4. Фьпс1пс1е <1овсееав> аязпс папеярасе яс<1; с1аяя яагер гас х; рыа11с: яагпр (тпс п) ( х = п; Самоучитель тпв Явах() ( левш:п х; тпь лаатпь) ( ватю А[10) .— — ( 1, 2, З, 4 5 б 7 8 9, 10 тпе ~ел(1=0р 1<10) 1++) сопт. « А( 1 ) . десх ( ) « ' ' Р сопл « "~п"; велпкп 0; 5.
Достоинства: Ссылка в качестве параметра при вызове функции не приводит к появлению копии объекта. Передача параметра по ссылке часто быстрее, чем его передача по значению. Параметр-ссылка упрошает синтаксис и процедуру вызова функции по ссылке, снижая вероятность ошибки. Недостатки: Изменения в параметре-ссылке меняют и используемую в вызове исходную переменную, следовательно параметр-ссылка открывает возможность сторонних эффектов в вызывающей программе.
б. Нет. 7. ()1пс1пае <1ов~кеат> пвтпа патпеврасе вТс(; чотс( жад (1опс ьп~ип, 1опс ов<(ев); тпс тпаьп() ( 1опд и = 4; 1опд о = 2; сопл (( "Значение 4, увеличенное на два порядка равно пад (и, О); сопв « и « '~п'; -елпкп 0; лот<(к~ай (1опч апшп, 1опо око(ел) ( йов(; ох<(ел; слоев -- ) пип =. пил * 10; Приложение Я. Ответы на вопросы и решения упражнений Упражнения 6Л 1. ((1пс1ийе <1озтгеатп> ()1пс1пое ссясг1пд> ()1пс1ис(е <сясс)11Ь> пя1пд пжпезрасе зМ; с1аяя з1т1уре ( с)тат *р; 1пб 1еп; рпЬ11с: з~гбуре(); ,а~гяуре(сваг *я, 1пс 1),. сЬат *депзкг1пр() ( тебштп р? 1пя це~1епц~й() ( теяптп 1еп; зт.к1уре;:з~ттуре(? ( р =.
пеи сйат[255) 1 1т ((р) ( сои1 « "Сшибка выделевия памяти~п"; ех1т.(1); ) *р = '10'; УУ яб левая строка 1еп — — 255; з".кСуре: ".зшкбуре(сЬак *я, 1пс 1) Н(з~г1еп(з) >=- 1) ( соис « "Вьделено слишком мало памяти.'1п"; ех1~ (1) 1 ) р = пеи сваг[ 1 1' Л('.р) ( соил « "сятибка выделения памяти1п"; ех1ш (1); астору (р, я) 1еп = 1; тпб па(п () Самоучитель С++ я1гСуре я1? зЬгсуре з2 ("Это проверка", 100) соса « "Строка я1: " «я1.де?я~г1пд () « "- длиной: сопс « з1.дес1епд~Ь() << '"~п"; соус « "строка я2: " << з2.деяятг1пд() << " — длиной: "? сопс « з2.дес1епд~Ь() << "1п"; лесплп 0; 2. // Имитапия секундомера ()1пс1пс?е <1оябгеа?а> (?1пс1пс?е <сс1п?е> пя?пд пажеярасе зъс?; с1аяя я орхассЬ с?опЬ1е Ьед?п, епо; рпЬ11с: з?ориапс??(); з~ориассЬ (с1ос)с Ь с); -я?орые?с??()' ло?б ясак- () ? чоЫ здор (); лотс? зЬои() .' з1ориассЬ::я1ориа~сп() ( Ьео?п = епс? = О,О; ) з~ориа~с??:: яЬорыа1с)т (с1ос)с Сс) Ьед?п = (с?оыЬ1е) с / С?ОС?(Я РЕК ЯЕС; епс? = 0.0; зЬорыаТсп::-яяориаЬсЬ() соуп « удаление объекта япорхапс?1 зЬои(); лоЫ яториавс?с:: ясапь () Ьес??п = (с?опЬ1е) с1ос)с() ( С1ОСКЯ РЕК ЯЕС; Приложение В.