|
Программирование >> Структурное программирование
Функции и целые классы могут быть объявлены друзьями не шаблонных классов. Для шаблонов классов также могут быть установлены отношения дружественности. Дружественность может быть установлена между шаблоном класса и глобальной функцией, функцией-элементом другого класса (возможно, шаблонного класса) или даже целым классом (возможно, шаблонным классом). Каждый шаблонный класс, полученный из шаблона класса, имеет собственную копию каждого статического элемента данных шаблона; все экземпляры этого шаблонного класса используют свой статический элемент данных. Как и статические элементы данных не шаблонного класса, статические элементы данных шаблонных классов должны быть инициализированы в области действия файл. Каждый шаблонный класс получает собственную копию статической функции-элемента шаблона класса. Терминология template<class Т> аргумент шаблона друзья шаблона имя шаблона имя шаблона класса ключевое слово class в шаблонном параметре типа ключевое слово template нетиповой параметр заголовка шаблона объявление шаблона функции описание шаблона функции параметр типа в заголовке шаблона параметр шаблона параметризованный тип перегрузка шаблонной функции статическая функция-член шаблона класса статическая функция-член шаблонного класса угловые скобки (< и >) формальный параметр заголовка шаблона функция-член шаблонного класса член данных static шаблона класса член данных static шаблонного класса шаблон класса шаблон функции шаблонная функция шаблонный класс Типичные ошибки программирования 12.1. Ошибкой является отсутствие в шаблоне ключевого слова class перед каждым формальным параметром типа. 12.2. Ошибка возникает, когда в списке параметров функции используются не все формальные параметры шаблона функции. 12.3. Если шаблон вызывается с определяемым пользователем типом в качестве параметра и если этот шаблон использует операции (например, ==, +, <= и др.) с объектами этого типа, то такие операции должны быть перегружены! Если эти операции остались не перегруженными, то при редактировании связей будет выдано сообщение об ошибке, потому что компилятор, конечно, сгенерирует вызов соответствующих перегруженных функций-операций, не обращая внимание на то, что эти функции не определены. 12.4. Компилятор подбирает вариант функции, соответствующий данному вызову. Если соответствующая функция не может быть найдена или если обнаружено несколько таких функций, то компилятор генерирует сообщение об ошибке. 12.5. В отличие от не шаблонных классов, которые могут быть вложенными, шаблоны классов не могут вкладываться друг в друга. Попытка вложить один шаблон класса внутрь другого приводит к синтаксической ошибке. Советы по повышению эффективности 12.1. Шаблоны несомненно расширяют возможности многократного использования программного кода. Но имейте в виду, что программа может создавать слишком много копий шаблонных функций и шаблонных классов. Для этих копий могут потребоваться значительные ресурсы памяти. 12.2. Если размер класса контейнера, например, массива или стека, может быть определен во время компиляции (например, при помощи нетипового параметра шаблона, указывающего размер), это устранит расходы на динамическое выделение памяти во время вьшолнения программы. Замечания по технике программирования 12.1. Шаблоны являются еще одной из многочисленных воз ложностей С++ по созданию более универсального программного обеспечения, которое можно использовать повторно. 12.2. Шаблоны функций, как и макросы, позволяют создавать программное обеспечение, которое можно использовать повторно. Но в отличие от макросов шаблоны функций в С++ позволяют полностью контролировать соответствие типов. 12.3. Применение шаблонов классов увеличивает возможности повторного использования программного обеспечения, когда классы для конкретного типа данных могут создаваться на основе родовой версии класса. 12.4. Определение размера класса контейнера во время компиляции (например, через нетиповой параметр шаблона) исключает возможность возникновения потенциально неисправимой ошибки во время выполнения программы, если оператору new не удастся получить необходимое количество памяти. Упражнения для самопроверки 12.1. Определите, являются ли следующие утверждения истинными или ложными. Если утверждение ложно, объясните почему. a) Дружественная функция шаблона функции должна быть шаблонной функцией. b) Если несколько шаблонных классов произведены от одного и того же шаблона класса с единственным статическим элементом данных, то каждый из шаблонных классов совместно использует одну копию этого статического элемента данных. Ь) Все описания шаблонов функций начинаются с ключевого слова , за которым следует список формальных параметров шаблона функции, заключаемый в . c) Все функции, образованные из одного шаблона функции, имеют одно и то же имя, поэтому компилятор использует механизм для того, чтобы обеспечить вызов соответствующей функции. d) Шаблоны классов также называются типами. е) операция используется с именем шаблона класса, чтобы связать описание функции-элемента с областью действия шаблона класса. f) Как и статические данные-элементы не шаблонных классов, статические данные-элементы шаблонов классов должны быть инициализированы в области действия . Ответы на упражнения для самопроверки 12.1. (а) Неверно. Это может быть и не шаблонная функция. (Ь) Неверно. Каждый шаблонный класс имеет свою копию статических данных-элементов, (с) Верно, (d) Неверно. Имена формальных параметров не обязательно должны быть уникальными среди шаблонов функций, е) Неверно. Ключевое слово class в этом контексте может также означать: любой встроенный тип , (f) Верно. 12.2. (а) шаблонными функциями, шаблонными классами. (Ь) template, угловые скобки (< и >). (с) перегрузки, (d) параметризованными. e) бинарная, разрешения области действия, (f) файл. Упражнения 12.3. Напишите шаблон функции bubbleSort для программы сортировки на рис. 5.15. Напишите программу драйвер ввода, сортировки и вывода массивов типа int и float. c) Шаблонная функция может быть перегружена другой шаблонной функцией с тем же самым именем. d) Имя формального параметра может быть использовано только один раз в списке формальных параметров описания шаблона. Имена формальных параметров шаблона должны быть уникальны среди всех описаний шаблонов. e) Ключевое слово class, используемое для параметров типа шаблона, означает: любой определяемый пользователем тип класса . f) Шаблонные классы не могут быть вложенными. 12.2. Заполните пропуски в каждом из следуюш;их утверждений: а) Шаблоны дают нам возможность определить при помош;и одного фрагмента кода группу связанных функций, называемых , или группу связанных классов, называемых
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |