- •6Vpj7-h3cxh-hbtpt-x4t74-3yvy7
- •Оглавление
- •Предисловие
- •Введение
- •1.1. Понятие класса и объекта. Инкапсуляция
- •1.2. Определение классов. Компоненты. Доступность
- •Class_key /*class_id*/ { /*members_list*/ };
- •Value_type class_id::function_id(parameters) {statements}
- •CPoint point1(100,70); // локальный объект
- •Static cPoint point3(50,120); // статический объект
- •Class_id(parameters) /*:initializer_list*/ {/*statements*/}
- •CString(const char *);
- •Delete[] __thematrix;
- •1.4. Обращение к компонентам объектов
- •1.5. Статические и нестатические компоненты классов
- •1.7. Указатель this
- •В опросы для самопроверки
- •2. Механизм наследования. Полиморфизм
- •2.1. Формы наследования. Базовые и производные классы
- •Class_key class_id: inheritance_specifier base_class_id {member_list};
- •2.3. Абстрактные классы
- •2.4. Множественное наследование и виртуальные классы
- •2.5. Преобразование динамических типов. Динамическая идентификация типов
- •Catch ( std::bad_cast & ) { // обработка исключения
- •Return 0;
- •Вопросы для самопроверки
- •3. Дружественные функции и классы
- •3.1. Дружественные функции
- •3.2. Дружественные классы
- •Вопросы для самопроверки
- •4. Механизм вложения
- •4.1. Вложенные классы
- •4.2. Локальные классы
- •Вопросы для самопроверки
- •5. Объектная модель и шаблоны
- •5.1. Определение, описание и инстанцирование шаблонов
- •::Function_id(function_parameter_list) { statements }
- •5.2. Параметры и аргументы шаблонов
- •Class identifier typename identifier
- •// Key, Data – параметры-типы (типы ключа и данных отображения)
- •// Container – контейнер, где содержится информация отображения class сMap {
- •Class MyTemplate
- •Int array[10]; struct Structure { int m; static int sm; } str;
- •5.3. Шаблоны компонентных функций
- •Value_type function_template_id(function_parameter_list) { statements }
- •::Function_template_id(function_parameter_list) { statements }
- •5.4. Специализация шаблонов
- •Вопросы для самопроверки
- •6. Перегрузка операций
- •Value_type operator @ (parameter_list);
- •Value_type operator @ (parameter_list) { statements }
- •Return fail();
- •6.3. Перегрузка бинарных операций
- •Value_type operator @ (parameter); // компонентная функция
- •Value_type operator @ (parameter, parameter); // глобальная функция friend value_type operator @ (parameter, parameter); // дружественная функция
- •Return *this;
- •Return *this;
- •/* Присваиваем собственные данные класса d */
- •6.4. Перегрузка операций управления памятью
- •Typedef void (*new_handler) ();
- •Extern new_handler set_new_handler( new_handler new_p );
- •Void operator delete(void * memory) {
- •... // Специальная обработка пользователя ::operator delete(memory); // освободить память
- •Вопросы для самопроверки
- •7. Механизм исключений
- •Throw expression
- •7.3. Специальные средства поддержки механизма исключений
- •Unexpected_function set_unexpected(unexpected_function func_name);
- •Typedef void (* unexpected_function) ();
- •Extern char * __throwExceptionName; extern char * __throwFileName; extern unsigned __throwLineNumber;
- •Вопросы для самопроверки
- •8. Подсчет ссылок
- •8.1. Назначение механизма подсчета ссылок
- •8.2. Контекстно-независимая модель счетчика ссылок
- •8.4. Внедрение подсчета ссылок в существующий класс
- •Вопросы для самопроверки
- •9. Стандартная библиотека шаблонов (stl)
- •9.1. Назначение и архитектура stl
- •9.2. Последовательные контейнеры
- •Class vector {
- •// Определение итераторов
- •Sort(first,last); // сортировка вектора в диапазоне итераторов
- •Ifstream ifile ("example.In"); ofstream ofile ("example.Out");
- •OutputIterator copy(
- •InputIterator first, InputIterator last, OutputIterator result );
- •// Заполнение списка
- •Operator- (int)
- •Operator- (random access iterator) operator[] (int)
- •InputIterator find(InputIterator first, InputIterator last, const t & value);
- •InputIterator find(InputIterator first, InputIterator last, const t & value)
- •Return first;
- •OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
- •Return result;
- •OutputIterator transform (InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op)
- •Return result;
- •Void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp)
- •__Quick_sort_loop(first, last, comp); __final_insertion_sort(first, last, comp);
- •T accumulate(InputIterator first, InputIterator last, t init, Function f);
- •V.Push_back(2); V.Push_back(5);
- •9.5. Функторы
- •T operator()(const t & X) const { return -X; }
- •9.7. Адаптеры
- •S1.Push(1); s1.Push(5);
- •// Записать в вектор числа 1 2 3 4
- •// Сортировать по неубыванию
- •// Записать в вектор числа 4 6 10 3 13 2
- •Вопросы для самопроверки
- •Заключение
- •Библиографический Список
- •6Vpj7-h3cxh-hbtpt-x4t74-3yvy7
5.2. Параметры и аргументы шаблонов
Одним из важных вопросов в работе с шаблонами классов является механизм параметров и аргументов. Мы уже кратко затрагивали этот вопрос, теперь же рассмотрим параметры и аргументы шаблонов подробно.
Параметры шаблона классов служат для обозначения общих свойств классов, объединяемых данным шаблоном. Они могут обозначать типы, классы, переменные и константы, которые могут быть подставлены в точку инстанцирования шаблона. Аргументы шаблона непосредственно представляют типы, классы, переменные и константы, подставляемые в точках инстанцирования, реализации и специализации шаблонов вместо соответствующих параметров.20 Напомним, что шаблон должен включать хотя бы один параметр. Максимальное количество параметров шаблона при этом не ограничивается.
Шаблонный класс может иметь три вида параметров. Наиболее распространены среди них параметры-типы (type-parameters). Параметры этого вида обозначают обобщенные типы (мы уже видели их применение выше в шаблоне CVector). Их можно использовать внутри определения шаблона для задания типов локальных переменных и функций, типов параметров функций и т.д. Другой вид параметров шаблона – шаблонные параметры (template parameters). Их назначение состоит в обобщении других параметров (например, с их помощью можно переписать шаблон CVector так, что он сможет хранить свои элементы в любом контейнере, а не только в одномерном динамическом массиве). Третий вид параметров шаблонов – ординарные параметры21. Эти параметры задаются как обычные параметры функций (декларации) путем указания идентификатора некоторого типа (встроенного или определенного пользователем) и неквалифицированного имени параметра. Одна из целей использования ординарных параметров – введение ограничений (например, с их помощью вместо шаблона, представляющего векторы «вообще», можно ввести шаблон, моделирующий векторы заданной длины).
Рассмотрим синтаксис параметров шаблонов.
Параметры-типы записываются в одном из следующих форматов:
Class identifier typename identifier
где identifier – это имя параметра. Смысловых различий при использовании служебных слов class и typename нет. Для записи шаблонных параметров шаблонов применяется такой формат:
template <template_parameter_list> class identifier
где template_parameter_list отображает список параметров самого шаблонного параметра, а identifier представляет имя параметра. Наконец, ординарные параметры используют формат обычной декларации параметра функции:
cv-modifiers type identifier
где type – стандартный или пользовательский тип, cv-modifiers – модификаторы (например, const), identifier – имя параметра.
Для иллюстрации ниже дан набросок определения шаблона классов, моделирующего понятие «бинарное отображение», где используются различные виды параметров:
template <class Key, class Data, int Len,
template <class T, int L> class Container>
// Key, Data – параметры-типы (типы ключа и данных отображения)
// Len – ординарный параметр (ограничение на длину контейнера)
// Container – контейнер, где содержится информация отображения class сMap {
Container <Key, Len> __key;
Container <Data, Len> __data;
...
};
Параметры шаблонных классов всех трех видов могут иметь значения по умолчанию. Их роль такая же, как и у функций: если аргумент отсутствует, то вместо него подставляется соответствующее умалчиваемое значение. Однако это значение используется при инстанцировании классов из шаблона. Для задания значения по умолчанию используется символ =, за которым следует выражение. Задать такое значение можно либо в декларации, либо в определении шаблона (и там, и там одновременно его задание запрещено и рассматривается как переопределение умалчиваемого значения). Для параметров-типов значением по умолчанию может быть идентификатор типа. Формат записи параметра-типа с учетом этого значения таков (отметим, что identifier может отсутствовать):
class identifier = type-id
typename identifier = type-id
Для шаблонных параметров значение по умолчанию – это выражение-идентификатор (id-expression). Формат записи шаблонного параметра с учетом значения по умолчанию будет таким:
template <template_parameter_list> class identifier = id-expression
Для ординарных параметров формат с умалчиваемым значением такой же, как и у функций.
Если некоторый параметр шаблона имеет умалчиваемое значение, то и все параметры, следующие за ним, независимо от их вида также должны иметь умалчиваемые значения. Сфера действия умалчиваемого значения распространяется от точки его появления до конца определения шаблона. Таким образом, его можно использовать при задании следующих по тексту параметров шаблона.
В примере, который дан ниже, иллюстрируются различные варианты задания значений по умолчанию для параметров разных видов и приводятся варианты инстанцирования.
Пример
template <class T> class CSomeClass { /* ... */ };
template <class U> class CAnotherClass { /* ... */ };
...
template <class C1 = int, class C2 = C1,
template <class T> class F = CSomeClass, C2 p = 0>