Г. Шилдт - Полный справочник по C++ (1109478), страница 74
Текст из файла (страница 74)
Иначе говоря, в качестве шаблонных параметров можно применять станлартные аргументы, например, целочисленные значения или указатели. Синтаксис такого объявления не отличается от объявления обычных паралзетров функций: необходимо лишь указать тип и имя аргумента. Рассмотрим один из наиболее удачных способов реализации безопасных обобщенных массивов, позволяющий задавать размер массива. Глава 18. Шаблоны // Демонстрация стандартных шаблонных параметров. Еъпс1пбе <Тозехеаш> Еьпс1пбе <свеб11Ь> пз1пс пзшезрасе веб; // Здесь целочисленный аргумент ззхе является стандартным.
Сешр1ахе <с1азв АТуре, Тпе зххе> с1азь аеуре ( АТуре а(в1зе]; // Длина массива передается через параметр зхзе. риЫТс: асуре () ( хедззеех зпе 1; Гох(1=0; 1<язве; 1++) а(1] = ].; АТуре Ьорехаеох(] (1пе 1); // Проверка диапазона для объекта аеуре. Сешр1аее <с1азз АТуре, Тпе язве> Атуре ьасуре<Атуре, зззе>::орехасох [)(Тпс ( 11(1<0 ]] 1> вазе-1) ( сове « "1пзначение индекса соос « х « " выходит за пределы допустимого диапазона. 1п"; еххе(1); ) хе(ыхп а[1]; ) хпс щазп() ( аеуре<зпс, 10> ТпсоЬ; // целочисленный массив из 10 элементов. асуре<бооЫе, 15> бооЬ1еоЬ; // Массив действительных чисел, состоящий из 16 элементов. 1пе соне « "целочисленный массив: Гох(1=0; 1<10; хт+) ТпеоЬ[1) = 1; Еох(1=0; 1<10г хв+) Соне « )пеоЬ[1) « созе « '1п'г соне « "массив действительных чисел: Гох(1=0; 1<15; 1++) досЫеоЬ[1] = (бооЫе) 1/3; Еох(1=0; 1<15г 1++) соне « доиЫеоЬ[1) « " "г согс « '1п' г 1псоЬ[12) = 100; // Генерирует сообщение об ошибке.
хееихп О; Внимательно рассмотрим спецификацию шаблона асуре. Обратите внимание на то, что параметр ззве объявлен как целочислеиный. Затем этот параметр используется в классе астре для объявления массива а. Хотя параметр язве применяется в исходном коде как обычная переменная, его значение извеспю уже на этапе компиляции. Это позволяет здлавать размер массива. Кроме того„параметр заве используется при проверке диапазона индекса в операторной функции орехасохЦ ().
Обратите Часть И. Язык С++ внимание на способ, которым создаются массивы целых и действительных чисел Второй параметр задает размер каждого массива. В качестве стандартных параметров можно применять лишь цслыс числа, указатели и ссылки. Другие типы, например х1оае, не допускаются. Аргумсшы, которые передаются стандартным параметрам, лолжны содержать либо целочислсн1 ~ую константу, либо указатель, либо ссылку на глобальную функцию или объект. Таким образом, станлартные параметры можно рассматривать как константы, поскольку их значения нельзя изменять. Например, внутри функции орекаеок [) () следуюший оператор не допускается. В въве = 10/ // Ошибка Поскольку стандартные параметры считаются константами, с нх помошью можно задавать размер массива, что довольно важно в практических приложениях.
)чак показывает пример безопасного обобщенного массива, стандартные параметры значительно расширяют возможности обобщенных классов. Хотя значения стандартных аргументов должны быть известны уже на этапе компиляции, это ограничение не слишком обременительно по сравнению с мощностью, предоставляемой ими Применение аргументов по умолчанию в шаблонных классах Шаблонный класс может ил1еть аргумент обобщенного типа, значение которого задано по умолчанию.
Например, такой. й Еешр1асе <с1авв Х=ъпс> с1авв шус1авв ( // Если прн конкретизации объекта типа шус1авв не будет указан ни один тип, используется тип впе. Стандартные аргументы также могут иметь значения по умолчанию. Они используются при конкретизации объекта, если не заданы явные значения арг/ментов. Синтаксическая конструкция, применяемая для этих параметров, не отличается от объявления функции, имеюших аргуменц ~ по умолчанию. Рассмотрим еше один вариант безопасного массива, предусматриваюший аргументы по умолчанию как для типа данных, так и для размера массива. // Демонстрация шаблонных аргументов по умолчанию. Мъпс1пбе <вовсгеаю> Фъпс1чде <свсд11Ь> ивъпп пал~еврасе всб; // Параметр типа стуре по умолчанию равен ъпе, // а переменная в1ке по умолчанию равна 10.
еетр1асе <с1авв артуре=зле, зпс в1хе=10> с1авв аеуре стуре а[авве)г // Размер массива передается аргументом язве. риЬ11с: а суре () ( гедъвеег 1пе 1/ Гох(1=0; 1<язве/ 1++) а[1] = 1; ) ятуре Ьорехасог[)(1пе 1); ); // Проверка диапазона для объекта аеуре. Сешр1асе <с1авв Лтуре, зпс въве> атуре ааеуре<лтуре, язве>::орегаеог[)(зпе 1) Глава 18. Шаблоны тт (1<0 ) ) 1> в[хе-1) ( соса « " хпвяачеяие индекса соде « 1 « ' выходит за пределы допустимого даипазояа.Хп"; ехьа(1); теьцтп а[1); 1па тайп() ( аеуре<ьпс, 100> ьпааттау // целочисленный массив // из 100 племен.оя.
аауре<с)опЫе> боцЬ1еахтау: // Массив действительных чисел, // размер залая по умолчанию. аауре<> бехатхау; // Г.'с умолчанию объявляется целочисленный // массив„ ссстояюий из 10 элементов. 1пс 1; соса « "целочисленный массив: тох(1=ОЙ 1<100; 1++) уптаттау[1) хох(>=0; 1»100у х++) соцс « 1пааттау[[) « соцс « 'Хп'; соцс « "Массив действительных чисел: хох(1=-О; ><10; тъъ) йоцЫеаттау[1) = (боцЫе) т/3; хох(1=0; 1<10; 1++) соцс <» цопЫеатхау[ 1) « попс «' 'хп'; соца « "Массив ло умолчанию: хот(т=О; ><10; 1++) дехаттау[1) = 1; хот(1=0: 1<10; 1>ъ) соиа « оехатхау[1) « соса « 'хп'г теситп 0; ) Обратите внимание на с)року в аетр1асе <с1азз Атуре=зла, [пх зз те=10> с1асв асуре ( Здесь тип в/туре по умолчанию является типом тпс, а переменная е1ве равна )О.
Как демонстрирует программа, объекты клааса асуре можно создать тремя способами. ° Явно задавая тип и размер массива. ° Явно задавая тип массива, используя размер по умолчанию. ° Используя тип и размер массива, установленные по умолчанию. Применение аргументов по умолчанию (особенно типов) повышает универсальность шаблонных классов. Если некий тип используется чаще других, его можно задать по умолчанию, предоставив пользователю самому конкретизировать другие типы. Явные специализации классов Как и при использовании шаблонных функций, можно создать явную специализацию обобщенного класса. Для этого, как и прсжлс, применяется конструкция веер1асе<>.
// Демонстрация специализации класса. Фхпс1цое <Есзстеап» Часть П. Язык С++ цвапд пащеврасе всб; сещр1аее <с1авв Т> с1авв щус1авв Т х; рцЬ11с: щус).авв(Т а) ( соне « "Внутри обобщенного класса щус1авв1п"; х=а: ) Т деехО ( геецхп х; ) ); // Явная специализация Лля типа 1пе. сещр1асе <> с1авв щус1авв<апс> ( 1пс х; рцЬ11с: щус1авв(апе а) ( сове « 'Внутри специализации щус1авв<1пе>хп"; к=а*а; ) 1пе деех() ( хегцтп х; ) 1пс ваап() ( тус1авв<доцЬ1е> б(10.1); соцс « "с(оцЬ1е: " « б.деех() « "1Мп'; щус1авв<впс> 1(5); сове « "Тпе: " « Т.десх() « "1п"; геецхп 0; ) Программа выводит ца экран слсдуюшис результаты Внутри обобщенного клаесса щус1авв боцЬ1е: 10.1 Обратите внимание ца следуюшую строку программы.
й сещр1асе <> с1авв тус1авв<апс> ( Она ссюбшает компилятору, что создается явная целочисленная специализация обобшениого класса гаус1авв. Такая же синтаксическая конструкция применяется для любой другой специализации класса. Яиия специализация класса расширяет возможности обобшеиных классов. поскольку она позволяет обрабатывать одну или две особые ситуации, предоставляя компилятору автоматически генерировать остальные специализации. Если программе потребуется слишком много специализаций, возможно, следует вообше отказаться ог обобшснных классов.
~~в Ключевые слова $урепаве и ехроп Сравнительно недавно в язык С++ были включены ключевые слова, связанные с шаблонами: еурезипае и ехрохе, имеющие особое значение для программирования. Кратко рассмотрим каждое из них. Глава 18. Шаблоны Ключевое слово еурепаве используется в лвух ситуациях. Во-первых, как указывалось ранее, оно может заменять ключевое слово ехава в объявлении шаблона. Например, шаблонную функцию аиарегдв() можно определить так. гевр1аге <гурепаве х> чо1г) аиарагдв(х ьа, х ьЬ) Х Гевр; гевр = а; а =. Ь; Ь = гевр; ) Здесь ключевое слово еурепаве задает обобщенный тип х. В этом контексте кчючевые слова с1авв и еурепаве не различаются.
Во-вторых, ключсвос слово еурепаве информирует компилятор о том, что некос имя используется в объявлении шаблонного класса в качестве имени типа, а не объекта. Рассмотрим пример. Я Гурепаве Х;:Бате еовеОЬЗесс; Здесь имя х: циаме используется в качестве имени типа. Ключевое слово еироге может предшествовать объявлению ееврзаее. Оно позволяет использовать шаблон из другого файла, повторяя лишь его объявление, а нс все определение.
Мощь шаблонов Шаблоны позволяют решить одну из самых трудных задач программирования; создать код, пригодный к повторному выполнению. С помощью шаблонов можно создавать схемы, применяемые в самых разных ситуациях. Рассмотрим в качестве примера класс аеас)г. Стек, описанный в главе 11, можно было использовать лишь для хранения целых чисел.
Даже если алгоритм не зависит от типа данных, жестко заданный тип стека ограничивает его применение. Однако обобщенный класс веае)г позволяет создавать стеки любых типов. Обобщенные функции и классы обеспечивают мощный механизм, позволяющий упростить программирование. Написав и отладив шаблонный класс, вы получаете законченный программный компонент, который можно применять в разных ситуациях. Теперь программист избавлен от необходимости предусматривать отдельные реализации для разных типов данных.
Хотя синтаксис шаблонов, на первый взгляд„выглядит усграшающе, они позволя)от сэкономить время и облегчают программирование. Шаблонные функции и классы получили очень широкое применение, и их популярность продолжает расти. Например, библиотека ВТ1 (З(апг)агг) Тетр1а(е 1лЬгагу — стандартная библиотека шаблонов), являющаяся частью стандарта языка С++, как следует из ее названия, построена на основе шаблонов. И последнее: хотя шаблоны образуют дополнительный уровень абстракции, в конце концов они компилируются в высокоэффективный объектный код. зев Часть 11. Язык С++ Полный справочник по Е 1 Ф Обработка исиючительных 6работка исктонительных сггогуацгги (схссрцоп йапг)!гпй) позволяет правильно О.
реагировать на ошибки, возникающие в ходе выпщщения программы. Используя механизм исключительных ситуации, программа может автоматически вызывать процедуру обработки ошибок. Это избавляет программиста от утомительного кодирования. ~ Основы обработки исключительных ситуаций Мсхаггизм обрабогки исключительных ситуаций в языке С++ основан на трех ключсвых словах: с*у, свес)к и снхогк Фрагменты программы, подлежащие контролю, содержат блок сху. Если в ходе выполнения программы в блоке еху возникает исключительная ситуация (т.с. ошибка), она генерируется с помощью кэюггсвого слова снхоге.