Главная » Просмотр файлов » Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004

Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 17

Файл №1160791 Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004) 17 страницаБ. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791) страница 172019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 17)

Еще важнее то, что определяемые пользователем типы, реализованные посредством модуля и предоставляющие доступ к реализации, ведут себя не так, как встроенные типы, и имеют по сравнению с ними иную (меньшую) поддержку. Например, время, в течение которого можно использовать Яас(е::(сер, контролируется б(ас(гссгеа1е () и 'о!ас(слйея( оу(), а не обычвымн правиллмн языка. 2.5. Абстракция данных б9 Объявление класса (то есть типа, определяемого пользователем) согар1ех описывает представление комплексного числа и набор операций над комплексными числами. Представление является закрытым (рг(чаье); то есть доступ к ге и ип имеют только функции, указанные внутри объявления класса сотр1ех.

Сами функции можно определить примерно так сотр1ех орега1огь (сотр1ех а!, сотр)ех а2) ге1игл сотр1ех (а)ге + а2.ге, а1лт ч- а2лт); сотр)ех а = 2.8; сотр1ех Ь = 1/а; сотр!ех с = а+Ь'сотр!ех (1, 2.З); //- с/ (с! = Ь) с = -(Ь/а)+2*Ь; Компилятор преобразует операторы, работающие с комплексными числами, в соответствующие вызовы функций. Например, с!=6 означает орега1ог!-(с,Ь], а 1/а означанг орега1ог/(сотр1ех (1), а). Большинство модулей (но не все) лучше представлять в виде типов, определяемых пользователем.

2.5.3. Конкретные типы Типы, определяемые пользователем, можно разрабатывать для реализации широко- го набора задач. Рассмотрим определяемый пользователем тип Яасй по аналогии с типом сотр1ех. Чтобы сделать пример более реалистичным, этот тип Яаск получает в качестве аргумента количество элементов в стеке: с1азз Всоси( сйаг* о, 1л1 1ор; !л1тах з)ге, риЬ11с.

с1азз !ЬнуегЯочс(); с1азз Ооег/(озс ( ); с)аззВас) з!ге (); 51а ей (т1 з), -91асй (); аоиу риза (сваг с); сйагрор(); //исключение !стек пуст) // исключение (переполнение) // исключение (непратчланий рознер) // конструктор ,1/ деструктор Функция-член стем же самым именем, что и класс, называется конструктором. Конструктор определяет способ инициализации объекта класса.

Класс сотр)ех предоставляет три конструктора. Один преобразует вещественное число в комплексное. Второй — создает комплексное число из пары вешественных, а третий — создает комплексное число со значением по умолчанию. Классом со!пр1ех можно пользоваться следующим образом: сои)Ясотр1ех г) ( Глава 2.

Обзор С++ 70 Конструктор Иасй (!и!) будет вызываться каждый раз при создании нового объекта класса. Он берет на себя заботу об инициализации. Если требуется какая-либо очистка памяти, когда объект класса выходит за пределы области видимости, объявляется логическое дополнение конструктора — деструктор: ЯасйгЯасй (!и!з) // конструктор ( !ор = О! т1 (10000<я) ГйготвВад з!ге (); тая з!ее=в, о = лепт сйа!.[з); //разместить элементы в свободной памяти // (куче, динамической палтти) // деструкптор Яасй: -5!асй () ( Ие!е!е[) о; Конструктор инициализирует новую переменную типа Иасй. Для этого он выделяет место в свободной памяти (называемой также кучей или диналгаческой памятью) с помощью оператора лент.

Деструктор освоботкдает эту память. Все происходнг без вмешательства пользователей Яасй. Пользователи просто создают и используют В!асй практически также, как переменные встроенных типов. Например: //глобальный стекиздегяти злементов // ссылка на 5!а ей б!асйв оаг1(10), оо!т!/(8!асй2 з геЯтп!!) ( Яасй в оаг2[!); В!асй з р!г = пети Яасй (20); //локпльный стек из ! злеменпгов //укпзптель нп Яасй, // размещенный в свооодной палтлттги Этот тип Иасй подчиняется тем же правилам именования, области видимости. создания, времени жизни, копирования и т.

д., что и встроенные типы, такие как тп! и сйаг. Естественно, функции-члены ризй () и рор () тоже должны быть где-то определены; оо!д бтасйгризй (сйаг с) ( !1:(!ор =- тах зсее) !йгов Ооег1(опт(); о[!ор) = с, !ор=!ори!; сйагЯасйгро)з () з оаг1 ризй('а'); з оа!.2ризй('Ь'); з ге~раей ('с'); з р!г->раей ('Ы'); //- ) // освободить ел ементы для возможного // последдющеео использования их памяти [у 6.2.6) 71 2.5. Абстракция данных (Е' (1ор == О) Епгот ЕЕпйеггЕ оги (); 1ор = 1ор — 1; ге1игп и(1ор), Типы, подобные сотр!ех и 51асй, называются конкретными тилалчи, в противо- вес абстрактным типам, у которых интерфейс в еще большей степени изолирует пользователя от деталей реализации.

2.5.4. Абстрактные типы сЕакк 31асЕ«( риЫЕс. кЕакк Сlпйег((ов (); с!акк Ооег((ош ( ), О тип исключения О тип исключепия »йггиа! ио!й рики (спаг 4 =0; »йг1иа! с(чаг рор () =0; ); Слово и(ггиа1 (виртуальцый) в языках В(шп(а и С++ означает «может быть замещено позднее в классе, производном от этого», Кпасс, производный от Иасй, обеспечивает реализацию интерфейса Иас(ч. Любопытный синтаксис =0 означает, что некоторый производный от Фас(ч класс должен определить эту функцию. Таким образом, этот Нас(ч может служить в качестве интерфейса любого класса, который реализует его функции рик(е () и рор ().

Приведенное определение 51ас(г можно использовать следующим образом; оо!й1 (ЭЕа сН к гкЕ) ( к гкйрикй ('с'); (Е (к гк)рор () ыис) 01гогоиай рор (); При превращении 31ас(ч из «псевдотипа», реализованного в модуле Я 2.5.1), в настоящий тип Я 2.53), одно свойство было потеряно. Представление не отделено от пользовательского интерфейса; скорее оно является частью того, что будет включено во фрагмент программы, использующей стеки. Представление закрыто, и поэтому доступ к нему возможен только через функции-члены, но оно все же присутствует. Если представление сколь-нибудь значительно изменится, пользователь должен будет перекомпилировать программу. Это является платой за то, что конкретные типы ведут себя в точности как встроенные. В частности, у нас не может быть подлинных локальных переменных, если мы не знаем размера их представления.

Для типов, которые редко изменяются, и в тех случаях, когда локальные переменные обеспечивают достаточную ясность и эффективность, такой способ приемлем и часто является идеальным решением. Однако, если мы хотим полностью изолировать пользователей стека от изменений его реализации, предыдущее определение ВЕас(к не годится.

Решением является отделение интерфейса от представления и отказ от подлинных локальных переменных. Во-первых, определим интерфейс: Глава 2. Обзор С++ с1аззАггау з1асй; риЫ!с81асй( //Аггву з(ась ре лизует э!все ейаг' р; !пстах з!ге; сп11ор, риЫсс: Аггау з1асй (!а! з). -Аг ау згасй (); иоЫ ризй (сйаг с); сйагрор (); : риЫ!с в верхней строке можно читать как «производный от», «реатизует» и «является подтипом».

Для того чтобы функция, подобная Я), могла использовать о1асй, не зная о деталях реализации, некоторая другая функция должна создать объект, с которыми может работать. Например: вой!00 ( Аггау згасй аз (200); Яаз), ) Так какЯ) не знает об Аггау з1асй, а знает только интерфейс Яасй, она будет работать одинаково хорошо с различными реааизациями Яасй. Например: с!азз1лз1 згасй:риЫ!сотасй( //!лз! з!асй реализует ййасй !!з1<сйаг> 1с; // список сил 1 волов //из стандартной библиотеки (э З.7.З) риЫ!с: глзг з1асй () () эо!д ризй (сйаг с) ( !с.ризй /гва1(с); ) сйагрор(), ); сйаг2лз1 згасйсрор () ( сйаг х = !с,/гоп1 (); !срор ~гоп1(); ге1игп х; ) // нплунить первый элемент //удалить первый элемент Здесь стек реализован с помощью списка символов.

Функция-член 1сризй /гоп1(с) добавляет с в качестве первого элемента 1с; вызов 1с рор ~гол!() удаляет первый элемент, а 1с/гоа1 () извлекает первый элемент 1с. Теперь любая функция может создать ЕМ з1асй и вызватьЯ) для работы с ним: Обратите внимание на то, как Г 0 использует интерфейс Иасй, находясь в полном неведении относительно деталей реализации. Класс, обеспечивающий интерфейс для множества других классов, называется полииорфным гпипоаь Неудивительно, что реализация может состоять из всего того, что есть в конкретном классе Яасй, но оставлено за бортом интерфейса о1асй: 2.6.

Объектно-ориентированное программирование ооЫ Ь () Еыг згася1К 1'(1з); 2.5.5. Виртуальные функции Как вьгзов з геу.рор () вД) связывается с подходящим определением функции? Ведь когдаЯ) вызывается из Ь (), должна быть вызвана Е?л1 з1аск::рор (). Когда же 1() вызывается иа д (), должна быть вызвана Аггау з1аск: рор ().

Для правилыюго разрешения имен объект 31аск должен содержать информациго, которая указывает, какая именно функция должна быть вызвана во время исполнения. Обычно реализации компиляторов пользуются технологией преобразования имени виртуальной функции в индекс в таблице, содержащей указатели на функции. Такая таблица часто называется «таблицей виртуальных функций (т(ггпа! !ппсг(оп гав(е)» илн просто п1ы.

каждый класс с виртуальными функцгими имеет свою собственную п1Ы, идентифицирующую его виртуальные функции, Это можно изобразить графически следующим образом: Объект класса Аггау е1аск о1Ы: Объект класса Из1 е1аск; йае1 е1пск::ризй 0 1с он 1 йрр3 Функции в ЫЫ позволяют корректно использовать объект даже в тех случаях, когда ни размер объекта, ни расположение его данных не известны в месте вызова.

Единственное, что нужно знать вызывающей стороне — это положение е1Ы в Яаск и индекс каждой виртуальной функции. Этот механизм виртуальных вызовов может быть реализован практически так же эффективно, как и «нормальный вызов функции». Требования по памяти составляют один указатель на каждый объект класса с виртуальными функциями, плюс одна о1Ы для каждого такого класса. 2.6. Объектно-ориентированное программирование Абстракция данных является фундаментальным аспектом качественного проектирования и будет оставаться в центре внимания при обсуждении вопросов проектирования на протяжении всей книги. Однако типы, определяемые пользователем, сами по себе недостаточно гибки, чтобы удовлетворить наши потребности.

В данном разде-. ле сначала демонстрируется проблема, связанная с простым типом, определяемым пользователем, а затем показывается, как ее решить с помощью иерархии классов. Глава 2. Обзор С++ 74 2.6.1. Проблемы, связанные с конкретными типами Конкретный тип, например «псевдотип», определенный с помощью модуля, описывает нечто вроде «черного ящика». После того, как черный я!цик определен, он практически не взаимодействует с остальной частью программы. Нет иного способа приспособить конкретный тип к нуждам других пользователей, кроме как изменить его определение. Эта ситуация может выглядеть идеальной, но она также может привести к черезвычайно негибкой системе.

Рассмотрим определение типа Зйаре (фигура) для использования в графической системе. Предположим, у нас есть два класса: с!аяяРот!(/*...*/); //Тонка с1аяя Со(ог(/" ...*/); //Ивет Символы /* и */ означают начало и конец комментариев. Такую нотацию можно использовать для многострочных комментариев и комментариев, которые оканчиваются в середине строки, то есть справа от них может идти код. Мы можем определить Зйаре следующим образом: епит 1С!пд (с!гс!е, гнапу1е, яуиаге й // перечисление (у" «В) // круг, треугольник, квадрат с1аяя Зйаре ( Кыд й; Рот! сеп!ег, Со(ог со1; //поле типа (какая фигурой) //це~трфигуры //цвет фигуры ри61(а ооЫ агат (); ооЫ го!а!е (!и!); // нарисовать // повернуть «Поле типа» й необходимо, чтобы такие операции, как й аш () и го!а!е (), могли определить, с каким видом фигуры они имеют дело (в Рааса(-подобном языке можно использовать ва- риантную запись с татом й).

Функцию й ав () можно определить следующим образом: ооЫ Зйаресй.а!о () ( яыпсЬ (й) ( саяе с!гс1е: // нарисоват ь окружность Ьгеай; саяе !г!апу(е // нарисовать треугольник Ьгеай; саяе ядиаге. // нарисовать квадраьп Ьгеай; Как видите, все смешалось: такие функции, как йаш (), должны «знать» обо всех возможных видах фигур. Поэтому код любой такой функции растет с добавлением новой 2.6. Объектно-ориентированное программирование фигуры в систему. Если мы определили новую фигуру, каждую операцию над фигурой нужно просмотреть и (вероятно) модифицировать.

Характеристики

Тип файла
DJVU-файл
Размер
10,02 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6353
Авторов
на СтудИзбе
311
Средний доход
с одного платного файла
Обучение Подробнее