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

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

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

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

Гарантия того, что члены мноэкества зе1<Снс1е"> являются объектами типа С1гс1е позволяет нам безопасно и эффективно применять к этим членам специфические для окружностей операции, такис как определение ралнуса. Если бы мы допустили, чтобы с ке1<С)гс1е" > можно было бы обращаться как с зе1<5/эаре*>, мы больше не смогли бы обеспечивать зту гарантию. Например, Т")) вставляет Тг1апн1е' в свой аргумент зе1<56аре">. Если бы зег<5йаре'> мог быть заменен на зе1<Снс1е'>, была бы нарушена фундаментальная гарантия того, что зе1<С1гс1е*> содержит только объекты типа Сн с1е". 13,б. Наследование и шаблоны 1етр!а!е<с!аяя Т> с!азя Р1г ( //указатель на Т Т'р; риб!1с. Р1г (Т"); Р1г (сопя! Ргг!' ) // копируюи(ий конструктор 1етр!а1е<с!ая Т2> орега1огР1г<Т2> (); // преобразование Рсг<Т> в Рсг<Т2> ы хотим определить операторы преобразования для зтих определяемых пользователем указателей Р1г, чтобы выразить отношения наследования, к которым мы привыкли для встроенных указателей.

Например: иоиЦ(Р1г<Си с1е> рс) Р1г<бпаре> ря = рс; Р1т С)гс1е>рс2=ря; // должно работ пыль // не должно работать Мы хотцм разрешить первую инициализацию в том и только в том случае, когда Заире является прямым или косвенным открытым базовым классом для Ссгс(е. В общем, нам нужно определить оператор преобразования таким образом, чтобы преобразование Р1г<Т в Р!г Т2> допускалось тогда и только тогда, когда Т* можно присвоить Т2. Это можно сделать следующим образом: 1етр1а1е<с1аяз Т> 1етр!а!с<с!азз Т2> Р1т<Т>зоре га1отР1г< Т2> () ( ге1игп Р1т<Т2> (р); ) Инструкция ге1игп будет скомпилнрована в том и только в том случае, когда указатель р (тнпа Т') может быть аргументом конструктора Р1г<Т2> (Т2*).

Позтому, если 7 можно неявно преобразовать в Т2', преобразование Р1т<7' в Р1г<Т2> будет работать, Например: ио1<(1 (Р1г<Сггс1е> р с) Р1г 5паре> ря = рс; Р1г С!гс!е> рс2- ря; // правильно: ложно преооразовать Сиг!е* в опаре* //оишбка: нельзя преобразовать опаре* в С!гс!е" Будьте внимательны н определяйте только логически осмысленные преобразования. Обратите внимание, что списки параметров шаблона и его члены-шаблоны нельзя объединить.

Например: 1етр!а1е<с1аяя Т, с!азз Т2> //ошибка Р1т<Т>ьоретагогР1г<Т2> () ( ге!игл Р1г<Т2> (р); ) 13.6.3.1. Преобразования шаблонов В примере из предыдущего раздела демонстрируется, что не может существовать отношений по умолчанию между классами, сгенерированными из одного шаблона. Однако для некоторых шаблонов мы хотели бы выразить такие отношения.

Например, когда мы определяем шаблон по указателю, мы хотели бы отразить отношения наследования между объектами, на которые указатели указывают. При желании члены-шаблоны Я 13.6.2) позволяют нам выразить множество таких взаимоотношений. Рассмотрим пример; 402 Глава 13. Шаблоны 13.7. Организация исходного кода Существует два очевидных способа организации кода с ишюльзованпем шаблонов: (1) Включать (!!1лс(ийе) определения шаблонов до их использования в единице трансляции. [2] Включать (только) объявления шаблонов до их использования в единице трансляции, и компилировать их определения отдельно. Кроме того, иногда шаблоны функций сначала объявляются, затем используются, а потом определяются водной и той же единице трансляции. Для илл!острацип различий между двумя этими подходами, рассмотрим просгой шаблон: Л!лс!ийе <!озггеат 1етр!а1е с!азз Т> иоейои1 (солз! Тз, 1) ( зейьсегг«1; ) Мы могли бы поместить это в ои1 с и включать в том месте, где требуется ои1 ().

Например: 0 изег!.с: 11!лс!ийе ои1.с" Д,! использование ои! !) О изегу.с: 11!пс!ийе "ои1.с' ,!/ использование ои1 () Таким образом, определение функции ои1() и все объявления, от которых она зависит, включаются в несколько едпнип трансляции. Генерировать код (только) когда он требуется и оптимизировать процесс чтения избыточных определений является задачей компилятора. Согласно этой стратегии подход к шаблонам функций такой же, как к встроенным функциям.

Одна очевидная проблема состоит в том, что все, от чего зависит определение ои1(), добавляется в каждый файл, использующий ои1(), увеличивая таким образом количество информации, которое должен обработать компилятор. >[ругая проблема состоит в том, что пользователи могут впасть в зависимость от объявлений, включенных только для определения ои1 (). Эту опасность можно свести к минимуму путем использования пространств имен, отсутствием макросов н, в общем, уменьшением включаемой информации. Стратегия раздельной компиляции является логическим завершением следующей мысли: если определение шаблона не включено в код пользователя, нп одна из его зависимостей не должна влиять на этот код.

Таким образом, мы разбиваем исходный ои1.с на два файла: 0 ои!./и 1етр!а1е<с!азз Т ио!йои1(солз1 ТГ>1) О ои1.с: и!пс!ийе<юз1геат> л! пс!ийе'ои! л' ехрог1 гетр!а1е<с!азз Т> иогй ои1(солз1 Т!' 1) ( з1й:сегг 1, ) Теперь файл ои1.с содержит всю информацию, необходимую для определения ои1 (), а ои1.)! содержит только то, что необходимо для ее вызова.

Пользователь включает только объявление (интерфейс); ! 3.8. Советы О изесбе: п(пайи(е'оиГ й" 'з з использование оп1 () О изес2.с: П(пс!ис(е'оиб)з' О использование ои( () Обратите внимание: для того чтобы к нему можно было обрашаться из различных единиц компиляции, определение шаблона должно быть явно объявлено с ехрог( Ц 9.2.3). Это можно сделать, добавив ех)зов( к определению или предварив нм объявление.

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

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

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

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

13.8. Советы [11 Используите шаблоны для представления алгоритмов, применимых ко многим типам арзументов; 8 13.3. [2) Используйте шаблоны для представления контейнеров; 8 13.2, [31 Создавайте специализации для контейнеров указателей с целью минимизации размера кода; 8 13.5. 404 Глава 13. Шаблоны [4] Всегда объявляйте общую форму шаблона до специализаций; 9 13.5. [5] Объявляйте специализацию до ее использования; б 135. [6] Сводите к минимуму зависимости определения шаблона от контекста инстанцирования; 9 13.2.5, 9 В.13.8, [7] Определяйте каждую объявленную специализацию; в 13.5.

[8] Проанализируйте, требуется лн специализация вашего шаблона для массивов и С-строк; 9 13.5.2. [9] Используйте аргументы шаблона для выбора алгоритма; 9 13А. [10) Используйте специализацию и перегрузку для предоставления единого интерфейса для реализаций одной и той же концепции применительно к различным типам; 9' 13.5. [11] Предоставьте простой интерфейс для простых случаев и используйте перегрузку и аргументы по умолчанию для менее общих случаев; в 13.5, э 13А.

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

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

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

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