книга (И.А. Волкова, А.В. Иванов, Л.Е. Карпов - Основы объектно-ориентированного программирования. Язык программирования С++), страница 16

PDF-файл книга (И.А. Волкова, А.В. Иванов, Л.Е. Карпов - Основы объектно-ориентированного программирования. Язык программирования С++), страница 16 Практикум (Прикладное программное обеспечение и системы программирования) (37574): Книга - 4 семестркнига (И.А. Волкова, А.В. Иванов, Л.Е. Карпов - Основы объектно-ориентированного программирования. Язык программирования С++) - PDF, страница 16 (37572019-05-09СтудИзба

Описание файла

Файл "книга" внутри архива находится в папке "И.А. Волкова, А.В. Иванов, Л.Е. Карпов - Основы объектно-ориентированного программирования. Язык программирования С++". PDF-файл из архива "И.А. Волкова, А.В. Иванов, Л.Е. Карпов - Основы объектно-ориентированного программирования. Язык программирования С++", который расположен в категории "". Всё это находится в предмете "практикум (прикладное программное обеспечение и системы программирования)" из 4 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Просмотр PDF-файла онлайн

Текст 16 страницы из PDF

Параметры шаблонаДля описания шаблонов используется ключевое слово template, вслед за которым указываются аргументы (формальные параметры шаблона), заключенные в угловые скобки. Формальные параметры шаблона перечисляютсячерез запятую, и могут быть как именами объектов, так и параметрическимиименами типов (встроенных или пользовательских). Параметр-тип описывается с помощью служебного слова class или служебного слова typename.В соответствии со Стандартом ISO 1998 C++ (см. [2], раздел 14.1.4)параметром шаблона может быть:— параметрическое имя типа— параметр-шаблон— параметр одного из следующих типов:ƒ интегральныйƒ перечислимый,ƒ указатель на объект любого типа (встроенного или пользовательского) или на функциюƒ ссылка на объект любого типа (встроенного или пользовательского) или на функциюƒ указатель на член класса, в частности, указатель на методкласса103Параметрический полиморфизмИнтегральные типы (раздел 3.9.1 Стандарта):— знаковые и беззнаковые целые типы,— bool, char, wchar_tПримечаниеПеречислимые типы не относятся к интегральным, но их значения приводятсяк ним в результате целочисленного повышения.При использовании типа в качестве параметра перед параметром, являющимся параметрическим именем типа, необходимо использовать одно изключевых слов: либо class, либо typename.ПримечаниеНе все компиляторы обрабатывают вложенные шаблоны (например, Microsoft*Visual C++ 6*: Visual Studio 98*).

Тем не менее, шаблонный класс может использоваться в качестве значения параметра по умолчанию. Далее будетрассмотрен шаблонный класс со следующим прототипом:template <class T, class A=allocator <T> > сlass vector{ . . .};В разделе 14.1.7 Стандарта явно сказано, что нетиповый параметр неможет иметь тип void, пользовательский тип, или плавающий тип, например:// template <double d> class X{ . . . };template <double* d> class X{ .

. . };template <double& d> class X{ . . . };// ошибка// OK// OKТаким образом, параметром шаблона не может быть формальный параметр нецелочисленного типа, например, float или double. Это можно объяснить тем, что основным назначением формальных параметров в качествепараметров шаблона является определение числовых характеристик параметрических типов (например, размер вектора, стека и так далее).Вместе с тем параметром шаблона может быть указатель, в том числеи на объект нецелочисленного типа.

При этом, естественно, указатель —фактический параметр может содержать как адрес одного объекта, таки массива однородных объектов.Использование шаблонов позволяет создавать универсальные алгоритмы, без привязки к конкретным типам.15.2. Шаблоны функцийСинтаксис шаблонов функций:104Параметрический полиморфизмПример:template <class T> T sum(T array[], int size){T res = 0;int i;for (i = 0; i < size; ++i )res += array[i];return res;}При обращении к функции-шаблону после имени функции в угловыхскобках указываются фактические параметры шаблона — имена реальныхтипов или значения объектов:Для конкретного использования приведенного выше шаблона длямассивов целых чисел размерности 10 следует написать:int iarray[10];int i_sum;//...i_sum = sum <int> (iarray, 10);Встретив такую конструкцию, компилятор сгенерирует конкретнуюреализацию функции sum с учётом специфицированных параметров (такаяфункция называется порожденной функцией).Так как допускается параметризовать шаблоны не только именами типов, но и объектами, то аргумент size можно указать в виде параметра шаблона:template <class T, int size> T sum (T array[]) { /* ...

*/ }Тогда вызов sum будет выглядеть соответственно:i_sum = sum <int, 10> (iarray);105Параметрический полиморфизмЗамечаниеСледует отметить, что использование шаблонов сокращает текст программы,но не сокращает программный код. в программе реально будет сгенерированостолько порожденных функций, сколько имеется вызовов функций с разныминаборами фактических параметров шаблона.15.3. Специализация шаблоннойфункцииПо сути, при использовании функции-шаблона используется механизм, позволяющий автоматически перегружать функции компилятором. Однакофункцию-шаблон можно перегрузить и явно.Если шаблонный алгоритм является неудовлетворительным для конкретного типа аргументов или неприменим к ним, то можно описать обычную функцию, список типов аргументов и возвращаемого значения которойсоответствуют объявлению шаблона.

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

Выведение типов аргументов возможно при условии, что списокфактических параметров вызова функции однозначно идентифицирует список параметров шаблона.Так, описанную выше шаблонную функцию можно вызвать следующимобразом:int iarray[10];int i_sum;//...i_sum = sum (iarray, 10);Так как тип первого фактического параметра — int, то компилятор автоматически трактует данный вызов, как:i_sum = sum <int> (iarray, 10);Если параметр шаблона можно вывести из более, чем одного фактического параметра функции, результатом каждого выведения должен быть одини тот же тип. Иначе вызов будет ошибочным.Пример:template <class T> void f(T i, T* p) { /* . . .

*/ }// . . .void g(int i){106Параметрический полиморфизм}// . . .f(i, &i); // правильный вызов// . . .// f(i,”hello world”); - ошибка, т.к. по первому// параметру T — int, по второму — const charВерсия шаблона для конкретного набора фактических параметровшаблона также называется специализацией.При выведении типов аргументов шаблона по типам фактических параметров функции нельзя применять никаких описанных выше преобразований параметров, кроме преобразований Точного отождествления, то есть:— Точное совпадение— Совпадение с точностью до typedef— Тривиальные преобразования:T[]↔T*T↔T&T→const TПример:template <class T> T max(T t1, T t2) {.

. .}int main(){max(1,2);// max<int>(1,2);max(’a’,’b’);// max<char>(’a’,’b’);max(2.7, 4.9);// max<double>(2.7, 4.9);//max(’a’,1);// ошибка — неоднозначность,// стандартные преобразования не// допускаются//max(2.5,4);// ошибка — неоднозначность,// стандартные преобразования не// допускаются}Неоднозначности не возникают при использовании явного квалификатора:max <int>(‘a’, 1);max <double>(2.5, 4);15.4.

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

Для каждого шаблона, подходящего по набору формальных параметров, осуществляется формирование специализации, соответствующей списку фактических параметров.2. Если могут быть два шаблона функции и один из них более специализирован, то на следующих этапах рассматривается только он(порядок специализаций описан далее).3. Осуществляется поиск оптимально отождествляемой функции изполученного набора функций, включая определения обычныхфункций, подходящие по количеству параметров. При этом еслипараметры некоторого шаблона функции были определены путемвыведения по типам фактических параметров вызова функции, топри дальнейшем поиске оптимально отождествляемой функции кпараметрам данной специализации шаблона нельзя применять никаких описанных выше преобразований, кроме преобразованийТочного отождествления4.

Если обычная функция и специализация подходят одинаково хорошо, то выбирается обычная функция.5. Так же, как и при поиске оптимально отождествляемой функции дляобычных функций, если полученное множество подходящих вариантов состоит из одной функции, то вызов разрешим. Если множество пусто или содержит более одной функции, то генерируетсясообщение об ошибке.15.5. Шаблонные классыТак же, как и для функций, можно описать шаблоны для классов.

Механизмшаблонов при описании класса позволяет, например, обобщенно описыватьмножество классов, единственное отличие которых заключаетсяв используемых типах данных.Объявление шаблона класса:Процесс генерации объявления класса по шаблону класса и фактическим аргументам шаблона называется инстанцированием шаблона.Обычно он совмещается с объявлением объекта соответствующего конкретного типа. Синтаксис такого объявления:108Параметрический полиморфизмИмякласса<Списокпараметровшаблона>Идентификаторобъекта;Функции-члены класса-шаблона автоматически становятся функциями-шаблонами.

Для них не обязательно явно задавать ключевое слово template.Пример:Описание стека для хранения величин разных типов данных:template <class T> class stack{T* body;int size;int top;public:stack ( int sz = 10 ){size = sz;top = 0;body = new T[size];}~stack() { delete[] body; }T pop(){--top;return body[top];}void push ( T x ){body[top] = x;top++;}};int main(){stack<int>S1( 20);stack<char>S2(256);stack<double> S3( 16);// .

. .}Так же, как и в шаблонах функций, использование шаблонов классовсокращает текст алгоритма, но не сокращает размер кода программы. Реальногенерируется столько описаний классов, сколько было объявлений объектовс разными параметрами шаблонов.Шаблонные классы могут иметь дружественные функции и классы.Дружественная функция, которая не использует параметры шаблона, имеетсяв единственном экземпляре, то есть она является дружественной для всехинстанцирований класса.Дружественная функция, которая использует параметры шаблона, самаявляется шаблоном. Конкретная реализация такой функции с учётом специфицированных параметров (порожденная функция) является дружественной для такого инстанцирования класса, которое совпадает по типамс фактическими типами аргументов порожденной функции.109Параметрический полиморфизмПример:template <class T> class Y{ .

. .};template <class T> class X{// . . .public:/* функция f1() является дружественной ко всеминстанцированиям класса */friend void f1();/* порождение функции f2() для фактического типа T являетсядружественной только к тому инстанцированию класса X,которое подходит по фактическому типу–параметру. */friend Y<T> f2(Y<T> par1);// . . .};template <class T> Y<T> f2(Y<T> par1){ /* . . . */ }Статические члены создаются для каждого инстанцирования класса.Пример:template <class T> class X{static T x1;// . .

.};int X <int> :: x1 = 0;double X <double> :: x1 = 1.5;int main(){X <int> xx1;X <double> xx2;. . .return 0;}15.6. Эквивалентность типовПри объявлении объектов с использованием шаблона задаются фактическиепараметры типа. При задании одного и того же набора аргументов шаблонаполучается один и тот же тип объекта.Использование ключевого слова typedef задает новое имя (синоним) длятипа, никакой новый тип при этом не создается. При задании типас использованием шаблонов эквивалентность типов проверяется с учетомсинонимов (typedef).110Параметрический полиморфизмПример:typedef unsigned int uint;template <class T, int s> class vect{ /* .

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