Г. Шилтд - Самоучитель C++ (DJVU), страница 86
Описание файла
DJVU-файл из архива "Г. Шилтд - Самоучитель C++ (DJVU)", который расположен в категории "". Всё это находится в предмете "практика расчётов на пэвм" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр DJVU-файла онлайн
Распознанный текст из DJVU-файла, 86 - страница
Оператор гуреЫ можно заменить оператором дупапйс спя$ в ситуациях, когда оператор $уре(в используется для проверки правильности выполнения операции приведения полиморфных типов. 6. Оператор 1уреИ возвращает ссылку на объект типа туре шГе. Проверка усвоения материала в целом 1. Здесь представлена версия функции репегаГого, в которой для контроля за выделением памяти используется механизм обработки исключительных ситуаций. !* Использование механизма обработки исключительных ситуаций для отслеяивания онибок вьщеления памяти Ъ' Б)»аре *депекасог () 1 Ьту ( яиьесЬ (гапс(() Ф 4) ( саяе О: лепппп пе»ч 1.1пе; саяе 1: лепппп пе»ч неспапд1е; саяе 2: тебалп пем Тпгапо1е; саяе 3: лепптп пем Нп11Б)»аре; ) сабсЬ (Ьаб а11ос Ьа) тепнлп КО11; теоптп НО1.1; 2. Ниже представлена версия функции Кепега$ог0, в которой используется оператор пе»г(полого»г).
Приложение В. Ответы на вопросы и решения упражнений // Использование оператора пеи (погпгон) Язаре *депегаеог () опаре "Ге~пр; внъесп (гапд() % 4) сазе Ол гесагп пеи(поспгон) ьтпе; сазе 1: гегагп пен(погпгон) несгапо1е; саяе 2: гегагп пеи(по1)~ он) Тгтапд1е; саяе 3: гевстп пеи (погпгон) ны11вларе; 1Г!текр) гесагп гезлр; е1зе гебагп НПЬ1; ГЛАВА 13 Повторение пройденного 1. Помимо обычных для языка С операторов приведения типов, в С++ поддерживаются дополнительные операторы, которые перечислены ниже: Оператор Назначение дупагп)с сав( ге(пгегрге( сает в(а()с сав( сопв( сав( Выполняет операцию приведения полиморфных типов Преобразует указатель на один тип в указатель на другой тип Выполняет операцию "обычного" приведения типов Лишает объекты атрибута сопвт 3.
С помощью оператора 1уреЫ. 4. з.Х (Еурез.д (ПегэУед) == гуре16(р*) ) соыб « "Указатель р указывает на объект класса Пег)'теЮп"; е1зе соил « "Указатель р указывает на обьект класса вазе~в"г 2. Класс 1уре шГо — это класс, который инкапсулирует информацию о типе данных. Ссылка на объект типа 1уре ш1оявляется возвращаемым значением оператора 1уреЫ. Самоучитель С++ 5. Пропущено слово "производного".
6. Нет. Упражнения 13Л 1. /* Программа превращения пробелов в вертикальные линии бвз использования инструкыии гая-пд папеярасе ягс)" */ Ипс1иг(в <1озсгвапР Нпс1цс(в <Езглвагв> фпг пафп(1пГ. агдс, спал *агдч()) хГ(акдс!-3) ( зЫ::соШ « "Преобразование <файл ввода <файл вывода>~п"; геяплп 1; зсс):."1бзспеап~ Ип(апдч(1))у // открытие файла для ввода зМ::ойзСгеав ХопЕ(агдзт(2)); lт создание файла для вывода Ы( (йонг.) ( згс(::соил « "Файл открыть невозмозжоХгт"; ге(.агп 1; 1й(! Гфп) ( зтс(::соцГ « "Файл огкрыть невозмовно~п"; гебптп 3,; с)гаг сп; 11п.ппзе1й(зСг(::1оз;:з11рнз); ,'/ не прогпскать пробелы нМ1в (! К1п.
вой () ) ( Е 1 гг >)с)т ! зй (с(т= ")с)т=- ' ~ 'т Ы() й1п.вой() ) йопя « сЬ; Й1п.с1озв(); йод..с1озв(); Приложение В. Ответы нв вопросы и решения упражнений 2. Безымянное пространство имен ограничивает область видимости идентификаторов тем файлом, в котором они объявлены. 3. Представленная ниже форма инструкции вявя вводит в текущее пространство имен только указанный в инструкции член: ия)пя мха пространства:: алаи; Следующая форма инструкции вящ делает видимым все пространство имен: цв)пя паваарасе пня пространства; 4. Поскольку вся стандартная библиотека С++, включая потоки с)п и сов1, объявлена в пространстве имен зМ, для совместимости большинство программ нужно вводить в пространство имен зЫ.
Это дает возможность использовать в программах имена стандартной библиотеки С++ непосредственно, без уточнения, к какому пространству имен они принадлежат. Для большинства программ альтернативой была бы необходимость задания всех ссылок на имена стандартной библиотеки с инструкцией вЖ:, Другой альтернативой являются инструкции вящ только для потоков, т. е. вяпя в16::с)п и иявя в1д::сая1.
5. Размещая код библиотеки в собственном пространстве имен, вы снижаете вероятность возникновения конфликтов имен. 23.2 1. /,' Преобразование строки в целое ()ьпс1цбе <ъоял таам> ()1пс1ис)е <сяптгпд> пягпо папеярасе яй6; с1аяя яплпуре ( сЬат яЕт(80); 1пь 1еп; рц)з11с: яСкьуре(сйат *ь) ( астору(яст, я); 1еп = явт1еп(я); оре асот сЬат "() ( тесцтп яптр оре авот тле() ( тепппп 1еп; ) гпп паьп () Г яГппуре я("Функции преобразования весьма улобны"); снап *р; п~' 1; 1 =- я; УУ преобразование строки я в целое — длину строки р = я; УУ преобразование строки я Самоучитель С++ в сЬаг * — указатель на строку сопс « "Строка: Ы"г сопб « р « "1пимеет длину " « 1 « " символов.
1п"; геЬигп 0; 2. ()1пс1пс)е <гояЬгеатп> паула пагпеярасе яЫ; 1пз р(1пГ Ьаяе, 1пГ ехр); с1аяя риг 1пЬ Ьаяе; 1пг ехр; рпЬ11с: Риг (1ПГЬ, 1пс е) ( Ьаяе = Ь| ехр = е; ) орегагог 1пЬ() Й геЬпгп р(Ьаяе, ехр); ) Возвращает основание Ьаяе в степени ехр 1п' р(1пг Ьаяе, 1пс ехр) ( 1пб ге~пр; аког(гетр=1; ехрр екр--) Ьещр = .ещр * Ьаяеу гегпгп лепр; 1пЬ тпа1п() ( рог о1(2, 3), о2(3, 3); 1пг геяп1Ь; геяи1г = о1; сои « геяп1г « '1п'у геяп1Ь - о2; сопб « геяи1Ь « 'М'; объекты можно указывать непосредственно в инструкции соус, как зто сделано здесь сопГ « о1 + 100 « 'М '; гесигп 0; ~з.з 1. // Пример разделения ресурса с трассировкой работы ()1пс1пбе <1ояЬгеагп> Приложение В.
Ответи йа вопроси и решения упражнений 645 (]1пс1цс)е <свгг1пд> пв1по пащеврасе зЫ; с1азз оцгрнг ( вгаг1с сЬаг онЕЬнЕ [255]; // это разделяеы~й ресурс вгаг1с Епг 1ппве; // если переменная 1пцзе равна О, буфер доступен; иначе он занят вгагфс Епг о1пг(ех," // индекс буфера сЬаг зГг[80]; шб 1; // индекс следующего символа в всг Еп хйо; // идентификатор объекта, должен быть положительным рпЬ1 1с: оцгрцс(1пГ и, сЬаг *в) ( затору(зсг, з); 1 = О; иЬо = и; ) /* Эта функтдкя возвращает -1 при ожидании освобождения буфера, она возвращает О при завершении вывода, и она возвращает ыйо, если буфер все еще используется */ ш'. риЬЬиЕ ( ) г 1К(!ззг[1]) ( // вывод закончен 1пнве = 0; // освобождение буфера гесигп О; // сигнал завершения 1Е (!1пизе) Еппве = ыЬо; // захват буфера 1Е(шаве != ыЬо) сопб « "Процесс" « иЬо « "сейчас блокирован1п"; гегцгп -1; // буфер использует кто-то еще 1Е (злг[1]) ( /' символы все еще выводятся оплЬцЕ [о1пс(ех] = згг[1]/ сонг « "Процесс " « иЬо « " выводит символы1п"; 1++; о1пс)ех++; оиЕЬиЕ [о1пс(ех] = ' 10'; // последним всегда идет нуль геЕпгп 1; гегпгп О; ) уоЫ зйон() ( сои « онЕЬпЕ « '1п'; ) сЬаг опЕрпЕ::опсЬиЕ (255); // это разделяемый ресурс шб оцбрМ ::1пизе = О; // если переменная шиве равна О, буфер доступен; иначе нет Епг онЕрпШ:: о1п<(ех = О/ // индекс буфера 1пг щафп () ( оц(.рог о1(1, "Это проверка" ), о2(2, " статических переменных") Самоучитель С++ иЬ11е (о1.риСЬШ() 1 О2.ри~ЬОГ() ); // вывод символов О1.
9ЬОрр () ' ге1игп О; 2. $1пс1ир:(е <1ояЕгеап> ()1пс1иде <пеы> нягпу пашеярасе ясб; с1аяя сеял ( ясасгс гпс сонпс; риЬ11с: ~ее~() ( соопв++; ) -Ьеяп() ( соипЬ--Г 1пс де~соипЬ() ( еснгл сонно; ) ): 1пб кея~::сонпГ. =- О; гпс па1п() сеял о1, о2р ов; соня « о1. деЕсоип1 () « " объектов существует1п"; сеял *рр У* Отслеживание ошибок выделения памяти с помощью старого и нового механизмов обработки ошибок *у ~ту ( р = пеи Сеял; т,Р выделение памяти объекту 1~(!Р) ( уу старый стиль сонг « "Ошибка выделения ПаМятИ1П"р гели и 1; ) сассЬ(Ьас( а11ос Ьа) ( // новьж стиль соня « "Олшрбка выделения памяти1п"у гелнгп 1; сонг «О1.цетсоипг. (); соня « " объектов существует после выделения памяти1п"; УУ удаление объекта бе1еке рр соня « о1.дессошпГ.(); 647 Приложение В.
Ответы нв вопросы и решения упражнений сонг « " объектов существует после удаления',и"; гетнгп О; 13.4 1. Для исправления программы просто сделайте переменную сиггеМ модифицируемой, чтобы ее можно было изменить с помощью постоянной функции- члена соипМпяО Решение упражнения представлено ниже: // Теперь программа исправлена г((пс1иг)е <1овггеав> ив(пи пагпеврасе вМ) с1авв Сеипгцоип ( 1пс (пег; 1пс ЕагдеЕ; пшгаЫе (п( сиггепГ; // делаем переменную сиггепт модифицируемой р ~11с: Соппгцсил(тпс де1ау, пи 1 = 1) ( гагцег = с1с1ау; (пег сиггеп( = О; Ьсо1 соппе1пд О сопвг ( сиггепг += (псг; 1г(спггепЕ >= Гагиет) сон( « "~а"; гееигп йа1ее; сонг « снггепе « гегнгп сгпе; 1пГ тпаьп ( ] СоипЮои'и оЬ(100, 2); иЫ.1е (оЬ. соипг1пд () ); гегигп О; 2. Нет, не может.
Если бы у постоянной функции-члена была возможность вызвать не постоянную функцию-член, то не постоянную функцию-член можно было бы использовать для модификации вызывающего объекта. б48 Самоучитель С++ 1. Да. 2. Да, поскольку в С++ определено автоматическое преобразование из типа Ы в тип довЫе.
3. Одна из проблем неявного преобразования конструкторов состоит в возможности просто забыть, что такое преобразование имело место. Например, неявное преобразование в инструкции присваивания очень напоминает перегруженный оператор присваивания, хотя их действия не обязательно аналогичны.
Когда вы создаете классы, предназначенные для широкого использования, чтобы не вводить в заблуждение потенциальных пользователей ваших классов, было бы правильным отказаться от неявного преобразования конструкторов. 1. /* В этой версии програвюы на экран выводится число символов, записанных в буфер */ ()1пс1пйе <говггеаш> ()1пс1ыбе <вггзсгеатв> азгпу патпезрасе вЕ6," фпб п~афп() ( сЬаг Ьпй (255) ~ озегзггеыл оввг(Ьий, зткео1 Ьыг); оесг « "ввод/вывод через массивы работает с потоками1п"; озсг <с "точно так же, как обычный ввод/вывод~о " << 1002 овсг « ' ' « 123.23 « 'хп'; можно также использовать манипуляторы озсг « Ьех « 100 « или флаги формата овгг.аепг"(ьов.":асьеп~1гас)т озсг « бес « 123.23; озвг « епб1 « епбз; // гарантия того, что буфер завержится нулем вывод на экран содержимого буфера соиЕ « ЬнГ; сенс « оасг.рсоипе()т геснгп Ор Приложение В.
Ответы на вопросы и решения упражнений б49 2. /* Массивы в качестве объектов ввода/вывода гри котглровании содержимого одного массива в другой Ф/ () 1пс1пт(е <1оз Ггеата> ()1пс1ис(е <зЬгзггеавт> пз1пд патлеярасе зГс(," спаг 1гтЬпт[] = "Это проверка ввода/вывода Свж, основанного на использовании символьных массивов"; сттаг оиГЬп1 [255]; 1пГ шафтт() ( тзГгзГгеатв фзГг(1пЬпй)т озГгзГгеаттт озГг (оиГЬий, яфзео5 оиГЬпй)т с)таг сттт ы)т11е [! 1зГг. ео1' () ) 1згг. Оег (сЬ); 11 (!1згг.еог()) озсг,рис(сЬ)( озгг.
рис ('1О' )т // нулевой символ завершения «< Ввод « т пЬпй « тп т соШ « "Вывод: " « оп~Ьпй << 'тп'т геГпгп О; 3. // Преобразование строки в число с плавагвтей точкой ()1пс1ис(е <1озггеаш> ()1пс1пс(е <зГгзггеавт> пяйпд патлеярасе япс(т 1пс шайп() 11оас Ет сйаг з [ , "= "1234.5б4"; // ветцественное в виде строки 1я'сгя'сгеат 1зГг(з) т Простой способ преобразования строки в ее внутреннее представление 1ясг » Йт сопс « "Преобразованная форма: " « й <« '1п' геспгп О; Самоучитель С+-~ Проверка усвоения материала главы 13 1.