Главная » Просмотр файлов » С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс

С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (1114944), страница 87

Файл №1114944 С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс) 87 страницаС.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (1114944) страница 872019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Например:}main() вызывает конкретизированную из шаблона функцию min(int*,int). В этойреализации Type заменено int, и тип переменной min_val, следовательно, равен int.Поэтому при обращении print(min_val) вызывается функция с аргументом типа int.Именно тогда, когда конкретизируется min(int*,int), становится известно, что привтором вызове аргумент print() имеет тип int. В этот момент такая функция должнабыть видима.

Если бы функция print(int) не была объявлена до конкретизацииmin(int*,int), то компилятор выдал бы сообщение об ошибке.Поэтому разрешение имен в определении шаблона происходит в два этапа. Сначаларазрешаются имена, не зависящие от его параметров, а затем, при конкретизации, –имена, зависящие от параметров.Но зачем нужны два шага? Почему бы, например, не разрешать все имена приконкретизации?Если вы проектируете шаблон функции, то, вероятно, хотели бы сохранить контроль надтем, когда разрешаются имена в его определении. Предположим, что шаблон min() – эточасть библиотеки, в которой определены и другие шаблоны и функции. Желательно,чтобы реализации min() по возможности использовали другие компоненты нашей жебиблиотеки.

В предыдущем примере интерфейс библиотеки определен в заголовочномфайле <primer.h>. Как объявление функции print(const char*), так и определениефункции min() являются частями интерфейса. Мы хотим, чтобы конкретизациишаблона min() пользовались функцией print() из нашей библиотеки. Первый этапразрешения имени это гарантирует. Если имя, использованное в определении шаблона,не зависит от его параметров, то оно обязательно будет относиться к компоненту внутрибиблиотеки, т.е.

к тому объявлению, которое включено в один пакет с этим определениемв заголовочном файле <primer.h>.На самом деле автор шаблона должен позаботиться о том, чтобы были объявлены всеимена, использованные в определениях и не зависящие от параметров. Если этого нет, тоопределение шаблона вызовет ошибку. При конкретизации шаблона компилятор ее неисправляет:508С++ для начинающих// ---- primer.h ---template <typename Type>Type min( Type* array, int size ){Type min_val = array[0];// ...// ошибка: функция print( const char* ) не найденаprint( "Minimum value found: " );// правильно: зависит от параметра шаблонаprint( min_val );// ...}// ---- user.C ---#include <primer.h>// это объявление print( const char* ) игнорируетсяvoid print( const char* );void print( int );int ai[4] = {12, 8, 73, 45 };int main() {int size = sizeof(ai) / sizeof(int);// конкретизируется min( int*, int )min( &ai[0], size );}Объявление функции print( const char* ) в файле user.C невидимо в том месте, гдепоявляется определение шаблона.

Однако оно видимо там, где конкретизируется шаблонmin(int*,int), но это объявление не рассматривается при компиляции вызоваprint("Minimum value found: "), так как последний не зависит от параметровшаблона. Если некоторая конструкция в определении шаблона не зависит от егопараметров, то имена разрешаются в контексте самого определения, и результатразрешения в дальнейшем не пересматривается. Поэтому на программиста возлагаетсяответственность за то, чтобы объявления имен, встречающихся в определении, быливключены в интерфейс библиотеки вместе с шаблоном.А теперь предположим, что библиотека была написана кем-то другим, а мы еепользователи, которым доступен интерфейс, определенный в заголовочном файле<primer.h>.

Иногда нужно, чтобы объекты и функции, определенные в нашейпрограмме, учитывались при конкретизации шаблона из библиотеки. Допустим, мыопределили в своей программе класс SmallInt и хотели бы конкретизировать функциюmin() из библиотеки <primer.h> для получения минимального значения в массивеобъектов типа SmallInt.При конкретизации шаблона min() для массива объектов типа SmallInt вместоаргумента шаблона Type подставляется тип SmallInt. Следовательно, min_val вконкретизированной функции min() имеет тот же тип. Тогда как разрешится вызовфункции print(min_val)?509С++ для начинающих// ---- user.h ---class SmallInt { /* ... */ }void print( const SmallInt & );// ---- user.C ---#include <primer.h>#include "user.h"SmallInt asi[4];int main() {// задать значения элементов массива asi// конкретизируется min( SmallInt*, int )// int size = sizeof(asi) / sizeof(SmallInt);min( &asi[0], size );}Это нормально: мы хотим, чтобы учитывалась именно наша функция print(constSmallInt &).

Рассмотрения функций, определенных в библиотеке <primer.h>,недостаточно. Второй шаг разрешения имени гарантирует, что если имя, использованноев определении, зависит от параметров шаблона, то принимаются во внимание имена,объявленные в контексте конкретизации. Поэтому можно быть уверенным, что функции,умеющие манипулировать объектами типа SmallInt, попадут в поле зрения компиляторапри анализе шаблона, которому в качестве аргумента передан тип SmallInt.Место в программе, где происходит конкретизация шаблона, называется точкойконкретизации. Знание этой точки важно потому, что она определяет, какие объявленияучитывает компилятор для имен, зависящих от параметров шаблона. Такая точка всегданаходится в области видимости пространства имен и следует за функцией, внутрикоторойпроизошлаконкретизация.Например,точкаконкретизацииmin(SmallInt*,int) расположена сразу после функции main() в области видимости// ...int main() {// ...// использование min(SmallInt*,int)min( &asi[0], size );}// точка конкретизации min(SmallInt*,int)// как будто объявление конкретизированной функции выглядит так:SmallInt min( SmallInt* array, int size )пространства имен:{ /* ...

*/ }Но что, если конкретизация шаблона случается в одном исходном файле несколько раз?Где тогда будет точка конкретизации? Вы можете спросить: “А какая, собственно,разница?” В нашем примере для SmallInt разница есть, поскольку объявление функцииprint(const SmallInt &) должно появиться перед точкой конкретизацииmin(SmallInt*,int):510С++ для начинающих#include <primer.h>void another();SmallInt asi[4];int main() {// задать значения элементов массива asiint size = sizeof(asi) / sizeof(SmallInt);min( &asi[0], size );another();// ...}// точка конкретизации здесь?void another() {int size = sizeof(asi) / sizeof(SmallInt);min( &asi[0], size );}// или здесь?В действительности точка конкретизации находится после определения каждой функции,в которой используется конкретизированный экземпляр. Компилятор может выбратьлюбую из этих точек, чтобы конкретизировать в ней шаблон.

Отсюда следует, что приорганизации кода программы надо быть внимательным и помещать все объявления,необходимые для разрешения имен, зависящих от параметров некоторого шаблона, передпервой точкой. Поэтому разумно поместить их в заголовочный файл, который#include <primer.h>// user.h содержит объявления, необходимые при конкретизации#include "user.h"void another();SmallInt asi[4];int main() {// ...}// первая точка конкретизации min(SmallInt*,int)void another() {// ...}включается перед любой возможной конкретизацией шаблона:// вторая точка конкретизации min(SmallInt*,int)А если конкретизация шаблона происходит в нескольких файлах? Например, что будет,если функция another() находится в другом файле, нежели main()? Тогда точкаконкретизации есть в каждом файле, где используется конкретизированная из шаблонафункция. Компилятор свободен в выборе любой из них, так что нам снова придетсяпроявить аккуратность и включить файл "user.h" во все исходные файлы, гдеиспользуются конкретизированные функции.

Тем самым гарантируется, что реализацияmin(SmallInt*,int) будет ссылаться именно на нашу функцию print(constSmallInt &) вне зависимости от того, какую из точек конкретизации выбереткомпилятор.511С++ для начинающих512Упражнение 10.13Назовите два шага разрешения имени в определениях шаблона.

Объясните, какимобразом первый шаг отвечает потребностям разработчика библиотеки, а второйобеспечивает гибкость, необходимую пользователям шаблонов.Упражнение 10.14НакакиеобъявленияссылаютсяименаdisplayиSIZEвреализации// ---- exercise.h ---void display( const void* );typedef unsigned int SIZE;template <typename Type>Type max( Type* array, SIZE size ){Type max_val = array[0];for ( SIZE i = 1; i < size; ++i )if ( array[i] > max_val )max_val = array[i];display( "Maximum value found: " );display( max_val );return max_val;}// ---- user.h ---class LongDouble { /* ...

*/ };void display( const LongDouble & );void display( const char * );typedef int SIZE;// ---- user.C ---#include <exercize.h>#include "user.h"LongDouble ad[7];int main() {// задать значения элементов массива ad// конкретизируется max( LongDouble*, SIZE )SIZE size = sizeof(ad) / sizeof(LongDouble);max( &ad[0], size );max(LongDouble*,SIZE)?}10.10.

Пространства имен и шаблоны функций АКак и любое другое глобальное определение, шаблон функции может быть помещен впространство имен (см. обсуждение пространств имен в разделах 8.5 и 8.6). Мы получилибы ту же семантику, если бы определили шаблон в глобальной области видимости, скрывего имя внутри пространства имен. При использовании вне этого пространстванеобходимо либо квалифицировать имя шаблона именем пространства имен, либоиспользовать using-объявление:С++ для начинающих// ---- primer.h ---namespace cplusplus_primer {// определение шаблона скрыто в пространстве именtemplate <class Type>Type min( Type* array, int size ) { /* ...

*/ }}// ---- user.C ---#include <primer.h>int ai[4] = { 12, 8, 73, 45 };int main() {int size = sizeof(ai) / sizeof(ai[0]);// ошибка: функция min() не найденаmin( &ai[0], size );using cplusplus_primer::min; // using-объявление// правильно: относится к min() в пространстве имен cplusplus_primermin( &ai[0], size );}Что произойдет, если наша программа использует шаблон, определенный в пространствеимен, и мы хотим предоставить для него специализацию? (Явные специализациишаблонов рассматривались в разделе 10.6.) Допустим, мы хотим использовать шаблонmin(), определенный в cplusplus_primer, для нахождения минимального значения вмассиве объектов типа SmallInt. Однако мы осознаем, что имеющееся определениешаблона не вполне подходит, поскольку сравнение в нем выглядит так:if ( array[i] < min_val )В этой инструкции два объекта класса SmallInt сравниваются с помощью оператора <.Но этот оператор неприменим к объектам, если только не перегружен в классе SmallInt(мы покажем, как определять перегруженные операторы в главе 15).

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

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

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

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