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

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

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

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

ОГ) ) // преобразование г1оас->1пг не // рассматривается // преобразование 11оаг->йопЫе // рассматриаается // рг1пг(ьпс): ргьпг(2) ргьпл(2.0Г); рг1пг(2); ) Это правило легко формулируется, аффективно компилируется, доступно для понимания, тривиально реализуется в компиляторе, но является постоянным источпикол» ошибок. Изменение порядка объявлений на обратный полностью меняет смысл кола: очег1оай чоай ргйпс(йосЬ1е); // первоначальные правила: чогй рг»пг[»пг); ча»й 0() ( рг»пг(2.0)» // рг1пг(йопЫе): рг»пг(2.0) рг1пг (2.

ОГ); // рг»пс (йопЫе): ргйпс (йоиЫе (2. 0Г) ) // преобразование »1оаг->йопЫе // рассматривается Да»»)»ое правило разрешения неоднозначности соответствует правилу для вызова виртуальных функций, в соответствии с которыл» выбирается член самого нижнего в иерархии класса. Изменение было очевидным. В результате исчезли ошибки, Правда, у зтого правила есть одно интересное свойство. Оно устанавливает чойй* в качестве корня дерева преобразований классов. Это согласуется с представлением о том, что конструктор создает объект в неформатированной памяти, а деструктор превращает объект в нее (см.

разделы 2.11.1 и 10.2). Преобразование вила «и* в чойй*> позволяет рассматривать объект как неформатированную память, сели никакие другие его свойства не представляют интереса. ИИИИИИИВ Перегрузка рг1пс(2); !! рг1пг (боиЫе): рг1вв (доиЫе (2) ) !! преобразование 1вг->бовЫе !! раооматриваетоя Таким образом, зависимость от порядка чревата ошибками. Это стало серьезным препятствием на пути эволюции С++ в направлении более интенсивного использования библиотек. Моей цели — распространить взгляд на программирование как на составление программ из независимо разработанных кусков (см. также раздел 11.3) — наряду со многими другими факторами препятствовала и зависимость от порядка.

Независимые от порядка правила перегрузки весьма усложняют определение и реализацию С++, поскольку следует поддерживать совместимость как с С, так и с предыдущим вариантом С++. В частности, не годилось простое правило: «Выражение, которое может быть корректно интерпретировано хотя бы двумя разными способами, неоднозначно и, стало быть, незаконно». Если принять данный тезис, то незаконными будут все вызовы рг1пс (), приведенные в примере выше. Я решил, что требуется некое правило «лучшего соответствия», которое позволило бы предпочесть точное соответствие типов соответствию, требующему преобразований, а безопасные преобразования (типа б1оас в с)оцЬ1е) — небезопасным (сужающим тип, искажающим значение и т.д., например, б1оаг в 1пс).

В результате обсуждения, уточнения и ревизии продолжались несколько лет. Некоторые детали все еще обсуждаются комитетом по стандартизации. Вместе со мной наиболее активное участие в процессе принимали Дуг Макилрой, Энди Кениг, Джонатан Шопиро. Еще на ранней стадии Дуг заметил, что мы чересчур близко подошли к попытке спроектировать «естественную» систему для неявных преобразований. Он считал правила РЕ/1 (которые помогал проектировать сам) доказательством того, что такую «естественную» систему нельзя создать для богатого набора типов данных — а в С++ есть весьма богатый набор встроенных типов с нерегулируемыми правилами преобразований, а также возможность определять преобразования между произвольными типами, определенными пользователем.

Желание сохранить совместимость с С, ожидания пользователей, намерение разрешить им определять типы, с которыми можно было бы работать точно так же, как с встроенными, — все это не позволяло запретить неявные преобразования. Полагаю, что решение оставить неявные преобразования было правильным. Я также согласен с наблюдением Дуга, что задача свести к минимуму количество неприятностей, которые могут преподнести неявные преобразования, сложна по существу. Согласен я и с тем, что полностью их избежать не удастся (по крайней мере, при соблюдении требования о совместимости с С).

Просто у программистов разные ожидания, поэтому, какое правило ни выбери, для кого-то оно обернется неприятным сюрпризом. Фундаментальная проблема заключается в том, что граф неявных преобразований встроенных типов содержит циклы. Так, существует неявное преобразование не только из сЬаг в (пг, но и из 1пг в сЬаг. Это потенциальный источник бесконечного числа мелких ошибок. Поэтому было решено отказаться от схемы, основанной на графе прсобразований. Вместо нее мы изобрели систему соответствий НИИИИИИИ Разрешение перегрузки «...зо исключением немногих случаев, когда старые правила могли зависеть от порядка, новые совместимы, и ранее написанные программы дадут те же результаты, что и до введения новых правил.

Компиляторы С++, выпущенные за последние два года, выдавали предупреждения по поводу тех зависящих ат порядка разрешений неоднозначности, которые теперь объявлены «вне закона». В С++ различаются пять видав соответствий: ш не требующее никаких или требующее только неизбежных преобразований (например, имени массива в указатель, имени функции в указатель на функцию и т в попас т); З нуждающееся в расширении интегральных типов (в соответствии са стандартом д(ч51 С, то есть: сЬвг в (пс, впогс в 1пс и их цпвздпей аналогов), а также «1оас в йоцЬ1е; а требующее стандартных преобразований (гпс в йоцЬ1е, цпвгдаей 1пс в зпс, йеггуей* в Ьаве* и т.п.); с) работающее с определенными пользователем преобразованиями (конструкторами и конверторами); ь«учитывающее многоточия (...

) в объявлении функции. Рассмотрим сначала функции с одним аргументом. Всегда нужно выбирать лучшее соответствие, а именно то, которое расположено выше в приведенном списке. Если есть два лучших соответствия, та вызов признается неоднозначным и компилятор выдает ошибку». Приведенные выше примеры иллюстрируют правило. Более точное его изложение можно найти в Ат«М. Следующее правило необходимо соблюдать, когда функпия имеет более одного аргумента (Аз«М]: «Если при вызове передается более одного аргумента, то выбирается функция, у которой хотя бы для одного из них соответствие лучше, а дпя остальных не хуже.

Например: с1ввв совгр1ех ( // совгр1ех(йоцЫе) г уо1й воЫ цозй тго1й вогй Г(гпг,йоцЫе); г(йоцЫе,гпс)) г(солгр1ех,1пс)г г(1пс ...)т г (сол1р1ех ... ); тгогй Е( г( г( д(солзр1ех з) 1,2.0)г // Г(заг,йоцЫе) 1.0,2)г // т(йоцЫе,1пс) г,1.2)г // т(солгр1ех,гпс) между переданными при вызове типами формальных и фактических аргументов.

Предпочтительными считались такие соответствия, при которых выполнялись наименее опасные преобразования. Это позволило избежать противоречий со стандартными правилами расширения типов и стандартными преобразованиями в С. В (Бсгоцзггпр, 1989Ъ) для версии 2.0 данная схема описана так: Перегрузка Г(з,1,3)г Г(2.0,к); Г(1,1); г'г' Г(соглр1ек ... ) Г (зпс г'! олнбка: неоднозначность Г(1пт,с(оцЬ1е) или Г(г(оцЬ1е,1пт)? Нежелательное сужение типа г(оиЬ1е до ьпс в третьем и предпоследнем вызовах влечет за собой предупреждение компилятора. Такое сужение разрешено в целях сохранения совместимости с С В данном случае сужение безвредно, но во многих других може~ привести к искажению значения, поэтому необоснованно применять его не стоит».

Уточнение формулировки этого правила лля нескольких аргументов привело к появлепик) «правила пересечения> (АКМ, стр. 312 — 3141. Впервые его сформулировал Эндрю Кениг в беседе с Дугам Макилросм, Джонатаном !!! оппро и мной. Кажется, именно Шапиро обнаружил странные примеры, доказавшие необходимость этого правила 1АКМ, стр. 3131. Обратите внимание на то, как серьезно мы полхолили к вопросам совместимости.

Если бы, принимая проектные решения, мы систематически отдавали предпочтение простоте и изяществу, а не совместимости, то сегодня С++ был бы купа компактнее н чи(це. Но в то же время оп был бы языком, интересным лишь малой горстке ценителей. Это предостережение против распространенного заблуждения, что если выражение р= 0 «делаеть указатсль р нулевым, то прелставленис нулевого указателя должно быть в точности таким, как у целого пуля, то есть состоять из одних нулевых битов. Но С++ достаточно сильно типизирован, для того чтобы позволить разработчику компилятора выбрать лля нулевого указателя любое представление, независимо от того, как он выглядит в исходном тексте программы.

Одно из исключений — использование многоточия для подавления контроля аргументов функции: 1пс рттпсг(сопев сьат* ...); г'г' неконтролнруеный вызов в стиле с рт1пт1(тглт, О, (спас)0, (чоьг)")О, (1пс*)0, (1пп(")())0); Здесь необходимы приведения типов для явного указания, какой 0 требуется. В этом примере могло бы быть перелано пять разных значений. 112.3. Нулевой указатель Кажется, ничто не вызвало более жарких споров, чем вопрос о том, как правильно обозначить нулевой указатель !не указывающий нн на какой объект). Сч-+ унаследовал определение нулевого указателя от классического С 1Кегп(81(ап, 1978]: «Константное выражение со значением 0 преобразуется в указател~, обычно называемый нулевым Гарантируется, что такой указател~ можно отличить от указателя но любой объект или функцию». А(«М дополнительно предупреждает: «Отметим, что нулевой указатель не обязательно представляется той же комбинацией битов, что и целый 0».

$ИИИИИИИ Разрешение перегрузки В Ко >с С аргументы функции вообшс нс проверялись, и лаже в Л1(81 С нельзя полагаться на контроль аргументов, поскольку он необязателен. Из-за этого обнаружить все нули в программе на С или С++ нелегко. Л поскольку в других языках принято использование символической константы для представления пулевого указателя, то программисты на С традиционно применяли для этой пели макрос ыО.'.(,. К сожалению, в Кс' >с С нет корректного переносимого опрслеления ыО(.(,. В ЛХ81 С разумным и все чаше употребляю>нимся определением (чп(,(. является (ыо(с)*) О. Однако в С+т и (оозс)*) О нельзя счесть удачным обозначением нулевого указателя: с)>аг* р = (»о1>(*)0> // корректно в С, но не в Саа Указатель ыойс(* нельзя присвоить ничему без явного приведения типа.

Если разрешить неявное преобразование чо1с(* к лругому типу указателя, то появится ссрьезная прореха в системе типов. Можно было бы считать (»ойс1* ) О специальным случаем, но вводить его стоит только тогда, когда ничего другого не остается. Кроме того, порялок применения С++ был определен задолго до принятия стандарта Л1(81 С, и я не хочу, чтобы особо важная часть С++ зависела от макросов (см. главу 18). Поэтому я использовал просто О. Те, кто не может жить без символической константы, обычно определяют нечто похожее на сопвс 1пс нпьь = О> // или Хает(пе НОЬЬ 0 Для компилятора опрелеленный таким образом )ч()( ( и Π— синонимы.

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

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

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

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