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

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

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

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

Следует отмеппь, что концепция единицы трансляции несколько более абстрактна, чем просто концепция "файла, обработанного препроцессором". Например, если дважды передать компилятору файл после обработки препроцессором для формирования единой программы, он выдаст две отдельные единицы трансляции (хотя, надо сказать, для этого нет причин). А.2. Объявления и определения В разговоре между собой программисты часто не делают различия между терминами объявление и определение.

Тем не менее в контексте ОтЖ важно точное значение этих слов . 1 Объявление — это конструкция С++, которая первый раз (или повторно) вводит в программу какое-либо имя. Объявление может одновременно быть и определением, в зависимости от того, какой объект и как вводится. ° Пространства имен и псевдонимы пространств имен. Объявления пространств имен и псевдонимов пространств имен являются определениями, хотя термин "определение" в этом контексте необычен, поскольку список членов пространства имен позднее может быть расширен (в отличие, например, от классов и перечислимых типов).

1 Нам кажется, что при обмене идеями из С и С++ признаком хорошего тона является крайне осторожное употребление этих терминов. Такой подход используется и в ланной книге. А.З. Детали правила одного определения 495 ° Классы, шаблоны классов, функции, шаблоны функций, функции-члены и шаб. лолы функций-членов. Объявление является определением тогда и только тогда, когда объявление включает связанное с именем тело, ограниченное фигурными скобками.

Это правило включает обьединения, операторы, операторы-члены, статические функции-члены, конструкторы и деструкторы, а также явные специализации шаблонных версий таких объектов (т.е. любого объекта типа юмсса и типа функции). ° Перечисления. Обьявленне является определением тогда и только тогда, когда оно включает список перечисленных значений, заключенный в фигурные скобки. ° Локальные переменные и нестатическне данные-члены. Эти объекты всегда рассматриваются как определения, хотя изредка встречаются и исключения. ° Глобавъные переменные. Если непосредственно перед объявлением не стоит ключевое слово ехсекп или переменная инициализирована, такое объявление глобальной переменной является одновременно ее определением.

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

° Директивы явного ннстанцировання. Их можно считать определениями. А.З. Детали правила одного определения Как уже упоминалось во введении к данному приложению, практическое использование этого правила связано с массой тонкостей. Рассмотрим ограничения данного правила в соответствии с областью их действия. А.3.1.

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

° Статические данные-члены. ° Шаблоны невстраиваемых функций, шаблоны невстраиваемых функций-членов, невстраиваемые члены шаблонов классов в случае, если онн объявлены с ключевым словом ехрокш Приложение А. Правило одного определенг(я 496 ° Статические данные-члены шаблонов классов в случае, если они объявлены с ключевым словом ехрогс.

Например, приведенная ниже программа на С++, состоящая из двух единиц трансляции, неработоспособна . 2 // Единица трансляции Хг 1пе соцпсег; // Единица трансляции 2г 1пс соцпсегг // ошибка: определено дважды! // (нарушение ОРЕ) Это правило не применяется к объектам с внутрвннич связыванием (объекты, объявленные в области видимости безымянного пространства имен или в глобальной области видимости с использованием спецификатора всас1с), поскольку, даже когда два таких объекта имеют одно и то же имя, они считаются разными. Объекты, объявленные в безымянных пространствах имен, считаются различными, если они находятся в разных единицах трансляции.

Например, следующие две единицы трансляции можно объединить в корректную программ~ на С++: // Единица трансляции Хг всас1с соцпсег = 2г // не имеет отношения к другим // единицам трансляции пашеврасе ( зго1б цп1срзе() // не имеет отношения к другим // единицам трансляции // Единица трансляции 2г вьас1с соцпсег О; // не имеет отношения к другим // единицам трансляции пашеврасе ( зго1сг цп1срзе() // не имеет отношения к другим ( // единицам трансляции ++соцпсег; 1пс шайп() ( цп1с1це () 3 Интересно, что эта программа работает на С, поскольку в С есть понятие пробного определения, которое является определением переменной без инициализации и может присутствовать в программе неоднократно. А.З.

Детали правила одного определения 497 Кроме того, если упомянутые выше объекты используются, в программе должен быть только один из них. У термина "используются" в данном контексте точное значение. Он означает, что к данному объекту где-то в программе есть обращение. Это обращение может быть доступом к значению переменной, вызовом функции или получением адреса такого объекта. Это может быть явное обращение в исходном тексте, но может быть и неявное. Например, выражение с оператором пем может создавать неявный вызов ассоциированного оператора с)е1есе для обработки ситуаций, когда конструктор генерирует исключение, которое требует очистки неиспользуемой (но выделенной) памяти.

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

Существуег несколько других видов неявного использования, однако для краткости изложения здесь они не рассматриваются. Существует два типа обращений, которые не являются использованием в данном контексте. Первый тип — зто обращение к объекту в операторе в1геой. Второй тнп подобен первому, но с определенным отклонением: если обращение является частью оператора сурезс) (см. раздел 5.6, стр. 79), то оно не является использованием в предыдущем контексте, если только аргумент оператора суре Ы не заканчивается указанием полиморфного объекта (объекта с (возможно унаследованными) виртуальными функциями). Рассмотрим, например, программу, содержащуюся в одном файле.

()1пс1ис)е <суре1пйо> с1авв Ресзс)ег ( ()1Е беНпес)())УИАИ?С) ч1ггиа1 -ресйс)ег() ( ) ()епЖЕ ); ехгегп Ресйбег с)> 1пг пайп() ( сопит с)заг* паше = Гурейс)(с)] .пате(); гетпгп (1пс)вйзеой(с)); ) Эта программа работает тогда и только тогда, когда не определен символ препроцессора ()уМАИ1С. На самом деле переменная с) не определена, однако обращение к с) в операторе в1хеоб (с)) не является использованием, а обращение в операторе сурейс) (с)) может быть использованием, только если с) — объект полиморфного типа (поскольку в общем случае не всегда удается определить результат применения полиморфного оператора гурейс) до момента выполнения). 498 Приложение А. Правило одного определения В соответствии со стандартом С++ ограничения, описанные в данном разделе, не требуют диагностических сообщений от компилятора С++.

На практике же компоновщик почти всегда сообщает о них как о двойных или пропущенных определениях. А.3.2. Ограничения "одно на единицу трансляции" Ни один объект не может быть определен в единице трансляции более одного раза. Так, приведенный ниже код на С++ работать не будет.

1п11пе чей й() () 1п11пе чойс( й() () // ошибка: двойное определение Это одна из причин для того, чтобы окружить код в заголовочных файлах так называемыми предохранителячи. // файл диакд лешо.)трр: ()ййпс)еЕ СШЫ)Э ОЕМО НРР ()с)еййпе ООДНО НЕМО НРР ()епс)18 // ООДЖ) ОЕ)~~(О НРР Такие предохранители обеспечивают игнорирование содержимого файла при его повторном включении директивой $1пс1иде, что позволяет избежать двойного определения любого класса, встроенной функции или шаблона, содержащихся в нем. Правило О)Ж также указывает, что в определенных обстоятельствах некоторые объекты далшсиы быль определены.

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

° Явный или неявный доступ к обьекгу типа Х. ° Преобразование выражения в тип Х или из типа Х с помощью процедуры преобразования любого вида; преобразование выражения в увззатель или ссылку на тип Х либо из указателя или ссылки на тип Х (за исключением чо1Й*) с помощью операции неявного приведения, а также с помощью операторов всас1с саик или Йупашйс санс. ° Присвоение значения обьекту типа Х.

° Определение или вызов функции с аргументом либо возвращаемым значением типа Х. Вместе с тем простое обьявлеиие такой функции не требует определения типа. А.З. Детали правила одного определения 499 Правила для типов применяются также к типам, генерируемым из шаблонов классов. Это означает, что в тех ситуациях, когда должен быть определен такой тип Х, должны быть определены и соответствующие шаблоны.

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

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

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

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