Главная » Просмотр файлов » Б. Страуструп - Дизайн и Эволюция C++. 2006

Б. Страуструп - Дизайн и Эволюция C++. 2006 (1160775), страница 71

Файл №1160775 Б. Страуструп - Дизайн и Эволюция C++. 2006 (Б. Страуструп - Дизайн и Эволюция C++. 2006) 71 страницаБ. Страуструп - Дизайн и Эволюция C++. 2006 (1160775) страница 712019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

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

Рассмотрим передачу объектов между машинами. Объект должен реконструироваться приемником в порядке, обратном тому, который передатчик использовал при его разложении. Это нельзя гарантировать для объектов, которыми обмениваются программы, скомпилированные разными компиляторами, если в языке нефиксированный порядок конструирования.

На данную особенность мне указал Кит Гордея, прославившийся своей библиотекой Н1Н (см. раздел 7.1.2). специальное средство. Также было отмечено, что едва ли объединением больших иерархий классов каждый день будут заниматься новички. А опытные программисты без труда воспользуются обходным путем. Еще одно, более общее возражение против переименования: я не люблю отслеживать цепочки псевдонимов при сопровождении кода. Если я вижу в тексте имя й, которое в заголовке определено как ц, в документации названо )з, а в коде вызывается как )с, то проблема налицо.

Разумеется, приведенный пример — крайность, но в таком стиле могут работать приверженцы макросов. Синонимы бывают полезны, а иногда и необходимы. Однако их употребление следует свести к минимуму, если мы хотим сохранить ясность и общность кода в различных контекстах. Благодаря новым средствам, прямо поддерживающим переименование, началось бы простое потворство использованию (в том числе, и необоснованному) синонимов. Это соображение стало и доводом против общего механизма переименования при обсуждении пространств имен (см.

главу 17). Инициализаторы членов и базовых классов ЩффффЯДЩ В первоначальном определении С++ не требовалось, да и нс разрешалось именовать базовый класс в инициализаторе. Например, если есть класс уессог: с1авв теолог // тассог(ьпг); то можно произвести от него другой класс тес: с1авв тес : ри)з11с гесгсг ( тес()пг,)пс); ): Конструктор класса тес должен вызывать конструктор уессох-. тес::гас(1пс 1сн, 1пс п1П)з) (п1чп-1см-1) // аргУмент Лля констРУктора базового класса ( // ) Данная нотация была причиной путаницы.

Явное использование имени базового класса, как требует версия 2.0, сделала запись достаточно прозрачной даже для неискушенных пользователей: час::тес(1пс 1ом, 1пг п1дб) : уесссг(п1дп-1ом-1) ( // Я считаю, что первоначальный вариант является классическим примером синтаксиса логичного, минимального и слишком лаконичного. Проблемы, которые возникали при изложении студентам темы инициализации базовых классов, полностью исчезли с появлением нового синтаксиса. Старый стиль инициализатора базового класса был сохранен на переходный период. Его можно было использовать только при одиночном наследовании, поскольку в противном случае он неоднозначен. Глава 13. Утючнення понятия класса Говори, что хочешь сказать, просто и прямо, Брайан Керннган 13.1 Введение Поскольку концепция классов является центральной в Сч-ч-, не прекращаются запросы о ее модификации и расширении.

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

Центральный вопрос — сделать концепцию классов достаточно гибкой, чтобы выразить все, что необходимо, оставаясь в рамках системы типов и не прибегая к приведениям типов и низкоуровневым конструкциям. 13.2. Абстрактные классы Последнее средство, добавленное в версию 2.0 перед фиксацией, — абстрактные классы. Запоздалые модификации версий всегда непопулярны, а внесение в последний момент изменений в определение языка еще того хуже.

Мне казалось, что несколько руководителей заподозрили меня в утрате представлений о реальности, когда я стал настаивать на включении этой возможности. К счастью, Барбара Му поддержала меня в том, что абстрактные классы необходимы уже сегодня, а не через год-два. Абстрактный класс предоставляет интерфейс. Прямая поддержка абстрактных классов: а помогает находить ошибки, возникающие из-за неправильного понимания роли классов как интерфейсов и их значения в представлении обьектов; а способствует применению стиля проектирования, основанного ца отделе- нии спецификации интерфейсов от их реализации.

13.2Л. Абстрактные классы и обработка ошибок С помощью абстрактных классов можно устранить некоторые источники ошябок (Ятгоцзггцр, 1989Ь~: Абстрактные классы 1! ИИИИИИИ «Одна из целей статического контроля типов — обнаружить ошибки и противоречия еще до запуска программы. Замечено, что большой класс поддающихся обнаружению ошибок пропускается системой контроля типов С++.

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

Поэтому программисту предстоит написать примерно токой код: с1авв вЬаре ( рохас сепгег; со1ог со1; // рцбугс: ро1пс нЬеге() ( гесцгп сепсег; ) чоЫ иоче(ро1пг р) ( сепгег=рг Оган()г ) Ч1ГГиа1 чофа кагале(1пс) ( еггог("нельзя повернуть")г аЬогс(); ) чзггца1 чо1д с)ган() ( еггог("нельзя нарисовать"); аЬогг(); ) // ); Если при этом пользователь забудет определить функцию с)сан ( ) в классе, производном от вЬаре (безобидная ошибка), или создаст «просто» фигуру и попытается ей воспользоваться (глупая ошибка), то произойдет серьезный сбой во время выполнения.

А если программист и не допустит таких ошибок, то память компьютера засоряется ненужными таблицами виртуальных функций для классов типа аЬаре и невызывоемыми функциями типа г)гаы() и госасе () . Связанные с этим затраты могут оказаться заметными. Решение — дать пользователю возможность сказать, чта у некоторой виртуальной функции нет определения, то есть она является «исключительно виртуальной». Это делается с помощью инициализаторо =О. с1авв вЬаре ( рохас сепгег; со1ог со1т рцбйгсг рогпс ыЬеге() ( гегцгп сепгег; ) чога аоче(рогпс р) ( сепгег=р; г)ган()г ) ч1ггца1 чофг) госасе(1пс) = О; // чисто виртуальная функция чфггца1 чогб дган() = О; // чисто виртуальная функция // Уточнения понятия класса ИЙИИИИИИВ Класс, где есть хотя бы одна исключительно виртуальная функция, называется абстрактным.

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

Некоторые пользователи считали зто важным вопросом (см. например, ЦОЬпзоп, 1989]). Но лишь за несколько недель до выпуска версии 2.0 я осознал, что очень немногие вообще понимают зту концепцию и что непонимание сути абстрактных классов было источником многих ошибок проектирования. 13.2.2. Абстрактные типы Типичной претензией к С++ было (и остается) то, что закрытые данные включаются в объявление класса. Поэтому при изменении закрытых данных приходится перекомпилировать весь код, в котором данный класс используется. Часто недовольство по этому поводу формулировали так: «абстрактные типы в языке С++ не являются по-настоящему абстрактнымиь или «данные на самом деле не являются скрытымиь.

Многие пользователи думали, что уж если они могут поместить представление объекта в закрытую секцию класса, то обязательно должны так поступить. Разумеется, зто неправильно (поэтому-то данная проблема многие годы и ускользала от моего внимания). Если вы не хотите помещать представление в класс, так и пе надо! Просто перенесите спецификацию представления в какойто производный класс. Нотация абстрактных классов позволяет сделать зто явно. Например, можно так определить множество указателей типа т: с1авв вес ( рц)з)зс: ц1тгца1 то1г) Тпвегс[Т*) =О; ч1глца1 чозб гегвотге(Т*) =О; чртсца1 1пс 1в лгелюет(Т*) =О; чргеца1 Т* Тсгвг() =О; тргсца1 т* пека() =О; тг1тсца1 -вес() ( ) ): Здесь есть вся информация, необходимая для использования класса зес, а также отсутствуют детали представления или реализации.

Только тот, кто действительно создает объекты классов зес, должен знать, как представлено множество. Например, если есть объявление с1авв в11вс вес: рц)»11с вес, рт1часе в11вс ( в11пк* сцгтепс е1есо ЗИИИИИИИ Абстрактные классы риытс: чоЫ гпяегс(Т*) чоЫ гешоче(Т*) гпг 1в шешЬег(т*) Т* г1гвс(); Т* пехс(); в1гвг яег() : в1гвс(), спггепс е1еш(0) то можно создать объекты я11яс яес, с которыми смогут работать пользователи класса яес, даже пе подозревающие ни о каком я11яс яес.

Например: чоЫ ивег1(веса в) Йог (Т* р = в.б1гвг(); р; р=в.пехг()) ( // использовать р чо1с) ивег2() ( в1гвг вег вв~ // ивег1(вв)) ) Важно, что функцию, в которой используется абстрактный класс яес, например ияег1 ( ), можно откомпилировать, не включая заголовочные файлы, содержащие определение я11яе яег и классы типа я11яе, от которых последнее зависит. Как уже отмечено выше, компилятор не позволяет создать объект абстрактного класса. Например: чо1б г(веса в1) ( вег в2; // правильно // ошибка: объявление объекта // абстрактного класса вег // правильно // правильно вес* Р = 0) вега в3 = в1; ) Концепция абстрактных классов важна потому, что позволяет провести более четкую границу между пользователем и разработчиком реализации.

Абстрактный класс — интерфейс к реализациям, содержащимся в производных от него классах. Это уменьшает число перекомпиляций после изменений, равно как и объем информации, необходимой для компиляции обычного фрагмента кода. С помощью абстрактных классов уменьшается зависимость пользователя от разработчика, снимаются претензии тех, кто жалуется на долгую компиляцию. Данное средство ИИИИИИИВ Уточнения понятия класса заодно служит и интересам поставщиков библиотек, которым больше не нужно беспокоиться, как изменения реализации отразятся па работе пользователей.

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

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

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

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