Контрольные вопросы к лекции №7 1. Что из себя представляет шаблон функций? Для чего он используется? Шаблоны, которые называют иногда родовыми или параметризованными типами, позволяют создавать (конструировать) семейства родственных функций и классов. Цель введения шаблонов функций - автоматизация создания функций, которые могут обрабатывать разнотипные данные. В отличие от механизма перегрузки, когда для каждого набора формальных параметров определяется своя функция, шаблон семейства функций определяется один раз, но это определение параметризуется. 2. Что является параметром шаблона? Сколько может быть параметров у шаблона и как соотносятся между собой перечисления этих параметров в заголовке шаблона и в списке формальных параметров функцийшаблонов? Можно считать, что параметры шаблона являются его формальными параметрами, а типы тех параметров, которые используются в конкретных обращениях к функции, служат фактическими параметрами шаблона. Именно по ним выполняется параметрическая настройка и с учетом этих типов генерируется конкретный текст определения функции. В списке параметров шаблона функций может быть несколько параметров. Каждый из них должен начинаться со служебного слова class. Имя параметра шаблона имеет в определяемой шаблоном функции все права имени типа, то есть с его помощью могут специализироваться формальные параметры, определяться тип возвращаемого функцией значения и типы любых объектов, локализованных в теле функции. Имя параметра шаблона видно во всем определении и скрывает другие использования того же идентификатора в области, глобальной по отношению к данному шаблону функций. Если внутри тела определяемой функции необходим доступ к внешним объектам с тем же именем, нужно применять операцию изменения области видимости. 3. В чем схожесть и различие шаблонов функций и шаблонов классов? Как и для шаблонов функций, определение шаблона класса может быть только глобальным. Шаблоны функций не могут быть частично специализированными, в то время как шаблоны классов могут. Шаблоны функций не могут иметь параметров шаблона по умолчанию, в то время как шаблоны классов могут. 4. Может ли шаблон компилироваться в программный модуль (объектный код) и почему? В каких файлах рекомендуется описывать реализацию методов параметризованных классов? Шаблон не может компилироваться в программный модуль, пока не будут заданы его аргументы. Реализацию методов и дружественных функций следует осуществлять в самом файле описаний (h — файле), либо внутри тела описания (тогда при существенном размере кода реализации теряется наглядность в представлении протокола и интерфейса класса), либо вне тела описания, но в том же файле описания. Этот способ представляется предпочтительным 5. В какой момент из шаблона класса создается реальный класс? Возможно ли в одном приложении из одного шаблона создание нескольких классов? Создание по шаблону реального компилируемого кода происходит только в момент подставки в шаблон реальных типов и значений параметров. Отсюда — компиляция происходит в каждом модуле программы, использующим шаблон, отдельно.