Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
для шпор(печатаем 8 стр на листе).docx
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
2.86 Mб
Скачать

11.Создание экземпляров шаблона. Инстанцирование.

Инстанцирование – это создание класса на основе шаблона путем подстановки аргументов в качестве параметров шаблонов.

template <class T>

class vec;

vec <int> a;

vec <float> b;

Два класса, порожденные от 1-го шаблона путем подстановки аргументов (в 1-ом int, во 2-ом float), явл-ся полностью различными и независимыми друг от друга.

Инструкция typedef для создания псевдонимов идентификатора.

vec <int> *a=new vec <int>;

{

vec <int> b(a);

std::cout << vec <int>::get_count();

}

typedef vec <int> vec_i;

vec_i *a= new vec_i;

{

vec_i b(a);

std::cout << vec_i::get_count();

}

12.Шаблоны и наследование.

class obj_count

{

static int _obj_count;

public:

static int get_count();

obj_count(){_obj_count++;}

~obj_count(){_obj_count--;}

};

  1. Наследование шаблонного класса от обычного класса происходит по стандартным правилам наследования классов.

template <class T>

class vec:public obj_count;

{

...

}

В конструкторе общего вида производного класса неявно вызывается конструктор по умолчанию базового класса.

vec <int> a;

vec <float> b;

std::cout<<a.obj_count();

  1. Наследование класса от шаблона.

template <class T>

class vec;

class vec_i_ptr:public vec <int*>

{

При наследовании класса от шаблона в качестве базового класса необходимо указать идентификатор шаблона с полным перечнем его аргументов.

  1. Наследование шаблона от шаблона.

template <class T>

class vec;

template <class T>

class vec_ptr:public vec<T*>;

При наследовании шаблона от шаблона в качестве базового класса необходимо указать идентификатор шаблона, аргументами которого могут быть как конкретные типы, так и параметры производного шаблона.

template <class A, class B>

class a;

template <class A>

class b:

public: a <A,A> или a <A,int>

13.Терминология шаблонов.

template <class T>

class vec;

vec <int> a;

1.class T-список параметром шаблона.

2.vec-имя шаблона.

3.int-список аргументов шаблона.

4.vec <int>-идентификатор шаблона

5.template <class T>-объявление шаблона.

class vec;

14. Параметры и аргументы шаблона.

1. Параметры-типы

class - определенный пользователем тип.

typename - встроенный тип.

2. Параметры-шаблоны.

template< >

^

|

(template <class> class A)

3. Параметры-не-типы (ординарные).

template < >

^

|

int a

Значения параметров по умолчанию.

template< class T1, // параметр-тип

typename T2, // параметр-тип

int I, // параметр-не-тип

T1 DefaultValue, // параметр-не-тип

template< class > class T3, // параметр-шаблон

class Character = char // параметр по умолчанию

>

Аргументы шаблона.

1. Аргумент-тип - идентификатор стандартного или определенного пользователем типа.

2. Шаблонный аргумент – имя ранее определенного шаблонного класса. Специализация шаблонов для таких аргументов не допускается.

template <class T>

class cont;

cont <vec<int> > a;

3. Ординарный аргумент (аргумент-не-типа) – имя или выражение, подставленное вместо параметра имени типа. Параметр-не-типа не может быть void, вещественным, зато может быть указателем или ссылкой на вещественное значение; не может быть классом.