Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++Builder.doc
Скачиваний:
7
Добавлен:
01.04.2025
Размер:
15.66 Mб
Скачать

3.6.2.1 Шаблоны

Шаблоны (параметризованные типы)позволяют конструировать семейство связанных функций или классов. Обобщенный синтаксис определения шаблона имеет вид

template <список шаблонных типов> { объявление } ;

Различают шаблоны функций и шаблоны классов.

Шаблон функции задает образец определений перегружаемых функций. Рассмотрим шаблон функции тах(х, у), которая возвращает больший из двух аргументов, которые могут быть любого, допускающего упорядочивание, типа:

template <class Т> Т тах(Т х. Ту) { return (x > у) ? х : у; } ;

причем тип данных, представленный аргументом шаблона <class T>, может быть любым. При его использовании в программе компилятор генерирует код функции тах в соответствии с фактическим типом передаваемых ей параметров:

int i;

Myclass a, b;

int j = max(i, 0); // тип аргументов int Myclass m = max(a, b); // тип аргументов Myclass

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

#define max(x,y) ((х > у) ? х : у) из-за блокировки механизма проверки типов, который дает такие преимущества языку C++ над обычным С. Очевидно, задача функции тах(х, у) - сравнить совместимые типы. К сожалению, использование макроса допускает сравнение несовместимых типов, например, int и struct.

Шаблон классов задает образец определений семейства классов. Рассмотрим пример шаблона Vector - генератора классов одномерного массива данных:

template <class T> class Vector

Над типизированными элементами этого класса выполняются одинаковые базовые операции (вставить, вычеркнуть, индексировать и т.д.), вне зависимости от конкретного типа элементов. Если обращаться с типом как с параметром, то компилятор будет генерировать классы векторов с элементами заданного типа.

Как и в случае шаблонов функций, разрешается явно переопределять тип шаблон классов:

class Vector<char *> ( ... };

причем символ Vector должен всегда сопровождаться типом данных, заключенным в угловые скобки.

3.6.2.2 Пространства имен

Большинство нетривиальных приложений состоят из нескольких файлов с исходным текстом программы. Эти файлы могут создаваться и обслуживаться группой программистов. В конце концов, все файлы собираются вместе и проходят через финальную процедуру сборки готового приложения. Традиционно принято, чтобы все имена, не заключенные в некоторой локальной области (функции, теле класса или модуле трансляции), разделяли общие глобальные имена. Поэтому повторное определения имен, обнаруженное в процессе сборки отдельных модулей, приводит к необходимости каким-то образом различать каждое имя. Решение этой проблемы в C++ возложено на механизм пространства имен (namespace).

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

namespace <идентификатор> { [<объявления>] } Существует три способа доступа к элементам идентифицированного пространства имен:

• Явная квалификация доступа к конкретному элементу:

ALPHA :: varl; // доступ к переменной из ALPHA BETA :: Fl; // доступ к функции из BETA

• Доступ ко всем элементам:

using namespace :: ALPHA; // доступ ко всем именам из ALPHA

• Объявление нового идентификатора в локальном пространстве имен:

using :: new_name; // добавление идентификатора

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]