Главная » Просмотр файлов » Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003)

Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003) (1160769), страница 91

Файл №1160769 Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003) (Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003)) 91 страницаД. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003) (1160769) страница 912019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Зтот ! Это может быль также тнп мус1авв чо1ас11еь нлн мус1авв попас чо1ас11еь, если функция-член описана как чо1ас11е, но зто чрезвычайно редкий случай. Приложение Б. Разрешение перегрузки 510 Б.2.2. Улучшение точного соответствия Для аргумента типа 1пс есть три общих типа параметра, которые дают точное соответствие: 1пс, 1псй ь~ 1пс сопвса. Тем не менее функция чаще всего перегружается по ссылкам. чо1й герогс(1псй)з чо1й герогг(1пг сопвой); // (1) // (2) 1пс пайп() ( бог (1пс К = 0; К<10з ++К) ( герогг (К)з // Вызов (1) ) герогс(42)з // Вызов (2) ) В таких случаях для )ча!це предпочитается версия без дополнительного спецификатора сопи С, тогда как для гча(це предпочтительна версия с сопя с. Заметим, что то же касается и неявного аргумента функции-члена.

с1авв Ыопйег ( риз11с: чойй с1сК()з //(1) чо1й с1сК() сопвс; //(2) чозй сасК() сопвс; //(3) Отметим, что неоднозначность существует только на платформах, где в1яе с — синоним для ипв1йпей 1пс. На платформах, где зто синоним для ипвьппед 1опоь тии рскйИб синоним типа 1опп и неоднозначности нет, поскольку встроенный оператор индексации также требует преобразования индексного выражения. встроенный оператор принимает аргумент типа рсгй1ЙЙ с, который на многих платформах эквивалентен з.пг, и потому полностью соответствует аргументу 5. Поэтому, даже если встроенный оператор индексации плохо соответствует неявному аргументу (с помощью пользовательского преобразования типов), это все же лучшее соответствие, чем оператор, определенный в (1) для действительной индексации! Это источник потенциальной неоднозначности .

Чтобы решить эту проблему для конкретной платформы, необходимо объявить оператор () с параметром рсгй1йй с либо заменить неявное преобразование типа в с)заг* явным (что обычно рекомендуется делать в любом случае, независимо от прочих моментов). Набор жизнеспособных кандидатов может содержать как статические, так и иестатические члены. При сравнении статического члена с несгатическнм качество соответствия неявных аргументов игнорируется (только нестатический член имеет неявный аргумент *с)з1в). Б.З.

Детали перегрузки 511 чоЫ гип((яопг)егй деч1се) ( с)еч1се. Г1сК() р // Вызов (1] деч1се.гасК(); // Вызов (3), поскольку нет // версии Хопг)ег::гасК() без // спецификатора сопев Наконец, изменив немного предыдущий пример, покажем, как два точных соответствия могут создавать неоднозначность, если выполнить перегрузку со ссылками и без ссылок. чей герогс(1пс); // (1) чоЫ герогс(1пей); // (2) чо1с) герогс(1пг сопзсй)р // (3) 1пк ша1п() ( аког (1пс К = Ог К<10г ++К) ( герогг (К) ; // Неоднозначность: (1) и (2) // соответствуют одинаково // хорошо герогг (42); // неоднозначность: (1) и (3) // соответствуют одинаково // хорошо Выводы: ° Т и Т сопвсй одинаково хорошо соответствуют гча1пе типа Т; ' ° Т и Тй одинаково хорошо соответствуют 1ча1ие типа Т.

Б.З. Детали перегрузки Предыдущий раздел охватывает большую часть ситуаций перегрузки, которые встречаются в повседневном программировании иа С++. К сожалению, есть еще очень много правил и исключений из этих правил — больше, чем было бы разумно включать в книгу, которая ие посвящена перегрузке функций в С++. Тем ие менее обсудим некоторые из них, поскольку оии используются несколько чаще, чем другие правила, в том объеме, насколько имеет смысл углубляться в подробности. Б.3.1. Предпочтение нешаблонных функций Если все прочие аспекты разрешения перегрузки равны, нешаблонная фуакция предпочтительнее экземпляра шаблонной функции (не имеет значения, сгеиерирован ли эк- Приложение Б.

Разрешение перегрузки 512 земпляр последней из определения обобщенного шаблона или же получен в результате явной специализации). Сешр1агесгурепаше Т» 1пс б(Т); // (1) ЧОЫ й (1ПС) 1 // (2) 3пс шаеп() ( гегцгп Т(7); // Ошибка: выбирается функция (2), // которая не возвращает значение Этот пример также ясно показывает, что разрешение перегрузки обычно не включает возвращаемый тип выбранной функции. Если делается выбор нз двух шаблонов, то предпочтение отдается более снеииализированнаму (при условии, что один из них более специализирован, чем другой).

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

Однако зто преобразование требует, чтобы были выполнены перечисленные ниже шаги. 1. Преобразование оЪзесс изВегзчеб сопвс в Вазе соцвс. 2. Пользовательское преобразование полученного объекта из типа Вазе сопла В тип 81ъогш 3. Преобразование с продвижением типа нз впогс в зпс. Б.З. Детали перегрузки 513 Это наиболее общий тип последовательности преобразования: стандартное преобразование (в данном случае из производного типа в базовый), затем пользовательское преобразование, после чего другое стандартное преобразование.

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

Так, если бы в рассмотренном примере имелась дополнительная функция-кандидат чоес? сорпа(яЬогс), она была бы предпочтительнее из-за отсутствия необходимости третьего шага (продвижения типа) в последовательности преобразований. Б.З.З. Преобразования указателей Указатели и указатели на члены класса могут подвергаться различным специальным стандартным преобразованиям, включая следующие: ° преобразования в тип Ьоо1; ° преобразования из типа произвольного указателя в тип чоес)*; ° преобразования указателей на производный тип в указатель на базовый тип; ° преобразования указателей на члены базового класса в указатели на члены производного типа Хотя все они могут обеспечивать "соответствие за счет стандартных преобразований", рейтинг у них разный. Прежде всего, преобразование в тип Ьоо1 (как из обычного указателя, так и из указателя на член класса) считается менее предпочтительным, чем любой другой стандартный тип преобразования.

Например: чоЫ сЬес)с(чоЫ*); // (1) чоег? сЬес)с(Ьоо1); // (2) чо16 геаггапде (Иакгех* т) ( свес)с (в); // Вызов (1) В категории преобразований стандартных указателей преобразование в тип чоЫ* считается менее предпочтительным, чем преобразование из указателя на производный класс в указатель на базовый класс. Кроме того, если есть указатели на различные классы, связанные наследованием, то предпочтительнее преобразование в указатель на ближайший базовый класс. Приведем небольшой пример. с1азе Хпкегйасе ( Приложение Б. Разрешение перегрузки 514 с1авв СолапопРгосеввев : рпЬ11с 1пкегбасе ( с1авв МасЬ1пе : рпЬ11с Сопааопргосеввев ( сЬаг* вегта11ве(1псегйасе*]; сЬаг* вегъа11зе(Сопапопргосеввев*)) // (1) // (2) чоЫ сЪлпр (МасЬ1пей щасЫпе) ( сЬаг* Ьпййег = вегъа11ае(щасЫпе); // Вызов (2) Преобразование из МасЬъпе* в Сопааопргосеввев* предпочтительнее, чем преобразование в 1пкегбасе*, что вполне понятно интуитивно.

Схожее правило применяется к указателям на члены класса: из двух преобразований связанных типов указателей на члены класса предпочтительнее преобразование с более близким родством в диаграмме наследования. Б.3.4. Функторы и функции-суррогаты 3 Оператор преобразования далжев глюке быть лрлменлм, в том смысле, что, например, оператор без спенафилатора сопле не может использоваться с объелтамл, имеющими слелнфнлвтор сопя е.

Ранее упоминалось, что после поиска имени функции для формирования начального набора перегрузки этот набор обрабатывается различными способами. Интересная ситуация возникает, когда выражение вызова ссылается на объект типа класса, а не на функцию. В этом случае возможны два потенциальных дополнения к набору перегрузки.

Первое дополнение очевидно: к набору можно добавить любой оператор-член () (оператор вызова функции). Объекты с такими операторами обычно называются функ- торами (см. главу 22, "Объекты-функции и обратные вызовы"). Менее очевидное дополнение возникает в ситуации, когда объект типа класса содержит оператор неявного преобразования в указатель на тип функции (или в ссылку на тип функции) . В такой ситуации к набору перегрузки добавляется фиктивная функция (так называемая функция-суррогат).

Эта функция-суррогат рассматривается как имеюшая неявный параметр, тип которого определяется функцией преобразования, в дополнение к параметрам, типы которых соответствуют таковым в целевой функции. Приведенный ниже пример значительно проясняет ситуацию. 5!5 Б.З. Детали перегрузки сурес)ей чойс) ГипсТуре(доиЫе,. 1пс) с1авв Хпдйгесгуипсгог ( риЬ11с: орегасог()(с)оиЬ1е, с)оиЫе); орегагог РипсТуре*() сопит> чоес) ассйчааве(1пбзгессрипссог сопвса бипсОЬ3) ( йипсОЬЗ (3, 5); // .Ошибка: неоднозначность! ) Вызов бипсОЬ3 (3, 5) рассматривается как вызов с тремя аргументами: бппсОЬ3, 3 и 5.

Жизнеспособные функции-кандидаты включают член орегасог ( ) (который рассматривается как имеющий параметры типа 1пс)згессрппссога, г)оиЫе и с)оиЬ1е) и функцию-суррогат с параметрами типа РипсТуре*, г)оиЬ1е и зпг. Суррогат обладает худшим соответствием для неявного параметра (поскольку требуется пользовательское преобразование), однако лучшим соответствием для последнего параметра. Следовательно, невозможно отдать предпочтение какому-либо из этих кандидатов, поэтому вызов будет неоднозначным. Функции-суррогаты относятся к одной из самых "темных" областей С++ и редко используются иа практике (к счастью). Б.3.5.

Другие контексты перегрузки Мы уже обсудили перегрузку в контексте определения того, к какой функции должно идти обращение в выражении вызова Однако существует несколько других контекстов, в которых также необходимо сделать подобный выбор.

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

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

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

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