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

Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 18

Файл №1004033 Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)) 18 страницаБьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033) страница 182018-10-07СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Выбор представления для некоторых фигур может оказаться слишком тесным, если потребуется втиснуть его в типично жесткие рамки представления общего типа Я(аре. 2.6.2. Классовые иерархии Проблема заключается в том, что не видно разницы между общими свойствами всех фигур (любая фигура обладает определенным цветом, может быть нарисована и т.д.) и особыми свойстваии отдельных их типов (окружность характеризуется радиусом и рисуется специфическим способом). Обьектно-ориентированное программирование призвано выявлять такую разницу и извлекать из этого максимальную пользу. Языки, которые располагают средствами, позволяющими явно выразить указанную разницу и использовать этот факт, поддерживают объектно-ориентированное программирование.

А остальные языки — нет. Механизм наследования (заимствованный в С++ из Яшц!а) решает проблему. Сначала мы определяем класс, который задает общие свойства всех фигур: с1авв Я(аре ( Рот( сеп(ег; Со!о( со1( д... риЫ(с: Рош((г((еге() (ге(игп сеп(ег; ) юЫ тоге (Ро!и( (о) (сеп(ег = (от ('* ... */ ((га(г(); ) г!г(иа! юг й ап ( ) = О( иииа( юЫ ю(а(е (!и( апе(е) = О( 0... )( Аналогично рассмотренному в 92.5.4 абстрактному типу о(асй, функции, для которых интерфейс вызова может быть сформулирован, а реализация — нет, объявляются виртуальными. В частности, функции ага(гО и го(а(е() могут определяться лишь для конкретных типов фигур.

Поэтому они и объявлены виртуальными. Отталкиваясь от определения класса Маре, мы можем писать универсальные функции, которые манипулируют векторами указателей на фигуры: го!а го(а(е а!1(гес(о(<Я((аре~>ь г, т(апя!е) ((поворачиваем элементы ч II на апя1е градусов ( 1ог((п((' = 0; 1<г.е!ге О ( эч!) г(() ->го(а(е(апл(е) ( во Глава 2 Обзор языка С++ Чтобы задать конкретную фигуру, мы должны, во-первых, указать, что это фигура вообще, а во-вторых, определить дополнительную специфику (включая виртуальные функции): сгазз С(гс(е: риЫгс Яворе ( (и! гад(из( риЫ!с: го(д дгат ( ) ( l * ...

* I ) гоЫ гоготе (Ы) ( ) У да, функция ничего не делает )т В языке СЧ--Ь говорят, что класс С!гс!е наследуется от (й дегггед !гога) класса Ягоре, а класс Вазе называется базовым (Ьозе) для класса С!гс7е. Альтернативная терминология называет Стгс!е и Кйаре подклассом и суперклассом (зиЬс)озз и зирегс)азз), соответственно.

Производный класс наследует все члены базового класса, а потому эту тему принято называть наследованием (ЫЬегцапсе) классов. Новая парадигма программирования звучит так: Решите, какие классы нужны; обеспечьте полный набор операций для каждого класса, явно выразите общность посредством наследования. Там, где нет общности типов, достаточно одной лишь абстракции данных. Степень общности между типами, которую можно выявить и отразить с помощью наследования и виртуальных функций, является лакмусовой бумажкой для определения того, насколько применим объектно-ориентированный подход к данной задаче. В некоторых предметных областях, таких как интерактивная графика, объектно-ориентированный подход применим широчайшим образом.

В других предметных областях, например в области математических вычислений, достаточно абстракции данных, а применение средств объектно-ориентированного программирования представляется ненужным или избыточным. Выявление общности между типами не является тривиальной задачей. Степень общности, которую можно найти, зависит от способа проектирования программной системы. Начинать искать общность типов нужно уже на начальной стадии проектирования, когда имеются лишь технические требования к системе.

Классы могут специально проектироваться как строительные блоки лля других классов. Уже существующие классы можно подвергнуть анализу на предмет выявления у них общих черт, которые можно выделить в общий базовый класс. Попытки рассмотреть вопрос о том, что такое объектно-ориентированное программирование, не обращаясь при этом к конкретным конструкциям языков программирования, предприняты в работах [Кеп,1987[, и [Воос)),1994[ (см.

823.6). Иерархии классов и абстрактные классы (82.5.4) дополняют, а не исключают друг друга (812.5). Вообще, перечисленные здесь парадигмы имеют тенденцию к комплиментарности и взаимоподдержке. Например, и классы, и модули содержат функции, в то время как модули содержат и классы, и функции. Опытный разработчик применяет различные парадигмы по мере необходимости. 2.7 Обобщенное программирование 81 2.7. Обобщенное программирование Решите, какие нужны алгоритмы; параметриэуйте их так, чтобы они могли работать со множеством подходящих типов и структур данны. 2.7.1. Контейнеры Мы можем обобщить стек символов до стека элементов любого тина, если объявим его шаблоном, а тип элементов сйаг заменим на параметр шаблона.

Вот соответствующий пример: !етрга!е<с1алл Т> сгат Я!ас!г ( Т* гг 1н! так млег и» !ар! р ив!!с: с!акт Ожег!)аю ( ) г с!ам Огег!)ои ( ) г Я!иск (и» л); -а!ас!г (); таЫ риля (Т); Трор() ' )' // конструктор // деструктор Префикс гетр!аге<сйш Т~ сообщает следующему за ним объявлению, что Т— зто параметр типа. Функции-члены определяются аналогичным образом; гетр!а!с<с!ам Т> гаЫ у!ас)(< Т>:: рилй ( Т с ) ( р'(гар == так лес) тйгот ОгегЯаи (); (тар) = с; !ар = гор л 1; гетр1а<с<сгалл Т> ТЯгас!г<Т'::рор() ( Ц((ар == 0) !агат !/н»енот (); !ар=!ар- 1; ге!игн г (!ар); Тому, кто захочет использовать стек, вряд ли всегда будет требоваться именно стек символов.

Стек это более общее понятие, не зависящее от символов. Соответственно, его желательно и определять независимым образом. Вообще, если алгоритм можно выразить независимо от деталей его реализации, причем приемлемым образом и без логических искажений, то так и надо делать. Соответствующая программная парадигма звучит так; 82 Глава 2 Обзор языка С+-ь Теперь приведем пример кода, использующего новое определение стека; Я(ос/с<снах> хс (200) ) ~У стек длл 200 символов 5(век<ветр(ех> лер)х (30); У стек длв 30 комплексных чисел Я(век< Вле<гп(» лй (45); У стек длл 45 списков целых коЫ 1'() ( вс.рива ( ' с ' ); (у(хе.рор () ! = 'с' ) гаком Вай рор(); вор(х.ривй (еотр!ех(1,2) ); «' (вор(х.рор ( ) ! = еотр1ех (1, 2) ) Яком Вай рор ( ) ) С помощью шаблонов можно также определять списки, вектора, ассоциативные массивы и т.д.

Классы, предназначенные для хранения набора элементов некоторого типа, принято называть контейнерными классами (соп(атее с)аваев), или просто контейнерами. Механизм шаблонов автоматически обрабатывается на стадии компиляции программы и не вносит дополнительных накладных расходов на стадии ее выполнения (что типично для ручного кодирования). 2.7.2. Обобщенные алгоритмы Стандартная библиотека языка С++ содержит богатый набор контейнеров, кроме того, пользователи могут разрабатывать собственные контейнеры (главы 3, 17, 18).

В результате мы сталкиваемся с ситуацией, когда желательно еще раз применить парадигму обобщенного программирования и параметризовать алгоритмы по типам контейнеров. Например, мы хотим сортировать, копировать элементы и осуществлять поиск в векторах, списках и массивах, но не хотим писать отдельные варианты функций хогг(), сору() и хеагсй () для каждого из типов контейнеров. Кроме того, вряд ли мы захотим жестко фиксировать структуру данных, принимаемую единственными вариантами функций.

Поэтому возникает задача обобщенного доступа к элементам контейнера, который не зависит от типа обрабатываемого контейнера. Один из подходов, а именно подход к контейнерам и нечисловым алгоритмам, принятый в стандартной библиотеке языка С++ (83.8, глава 18), фокусируется на понятии последовательностей элементов (веаиепсех) и на манипулировании ими с помощью итераторов (Вегагогх). Понятие последовательности элементов графически иллюстрируется следующим образом: начало конец элементы: ( , 'Ь Д Ь' †. Ь' Д У последовательности элементов (е(ещепгв) есть начало (Ье8(п) и конец (епд).

Итератор ссылается на элемент последовательности, и для него существует операция, позволяющая ему перейти к следующему элементу последовательности. Конец последовательности представляется итератором, ссылающимся на нечто, расположенное за последним элементом последовательности. Физическое представление вз 2.7. Обобщенное программирование гетр!осе<с(аьв 1п, с(аээ Оиг> юЫ сору(1п !сот, 1п 1оо (аг, Оиг го) ( и Ьйе (угот ! = <оо уаг) ( *го = "7гот; УУ копируем элемент указуемый итератором ««со; УУ следующий выходной элемент +Г УУ следующий входной элемент Этот обобщенный код копирует элементы любых контейнеров, для которых можно определить итераторы с правильным синтаксисом и семантикой.

Наш обобщенный копирующий алгоритм можно также применить и ко встроенным в С++ низкоуровневым массивам и указателям, поскольку требующиеся операции для них определены: сяаг гс! [200) ) сйаг гс2 [500); У массив иэ 200 символов ,Умассив иэ 500 символов юЫ1'( ) ( сору (ьис1 [О), ьис1 [2001, ь 2 [0) ); Здесь все элементы массива ис1 копируются в начало массива ю2. Все контейнеры стандартной библиотеки (э[6.3, глава 17) поддерживают концепции последовательностей и итераторов.

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

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

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

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