69736

Використання шаблонів класів

Домашняя работа

Информатика, кибернетика и программирование

Щоб створити за допомогою шаблона конкретний об’єкт конкретного класу (цей процес називається інстанціонуванням), при описі об’єкту після імені шаблона в кутових дужках перераховуються його аргументи...

Украинкский

2014-10-09

32.5 KB

0 чел.

Самостійне вивчення

Тема 13: Використання шаблонів класів

Щоб створити за допомогою шаблона конкретний об'єкт конкретного класу (цей процес називається інстанціонуванням), при описі об'єкту після імені шаблона в кутових дужках перераховуються його аргументи:

ім'я_шаблона <аргументи> імя_об'єкта [(параметри_конструктора)];

Аргументи повинні відповідати параметрам шаблона. Ім'я шаблона разом з аргументами можна сприймати як уточнене ім'я класу. Приклади створення об'єктів за шаблонами:

List <int> List_int;

List <double> List_double;

List <monstr> List_monstr;

Block <char, 128> buf;

Block <monstr, 100> stado;

При використанні параметрів шаблона за замовчуванням список аргументів може виявитися порожнім, при цьому кутові дужки опускати не можна:

template<class T = char> class String;

String<>* p;

Якщо параметром шаблона є шаблон, який має спеціалізацію, вона враховується при інстанціонуванні:

template<class T> class A {                // Початковий шаблон

int x;

};

template<class T>  class A <T*> {  // Спеціалізація шаблона

long x;

};

template <template<class U> class V> class C{

V<int> у;

V<int*> z;

};

C<A> с;

В даному прикладі V<int> всередині С<А>  використовує початковий шаблон, тому с.у.х має тип int, а V<int*> використовує спеціалізацію шаблона, тому c.z.x маєтип long.

На місці формальних параметрів, які є змінними цілого типу повинні стояти константні вирази.

Після створення об'єктів за допомогою шаблона з ними можна працювати так само, як з об'єктами звичайних класів, наприклад:

for (int і = 1; i<10; i++) List_double.add(i * 0.08);

List_double.print();

//..................................

for (int і = 1; i<10; i++) List_monstr.add(i);

Listmonstr.print();

//---------------------------------------

strcpy(buf, "Дуже важливе повідомлення");

cout << buf << endl;

Для спрощення використання шаблонів класів можна застосувати перейменування типів за допомогою

typedef:

typedef List <double> Ldbl;

Ldbl List_double;

Спеціалізація шаблонів класів

Кожна версія класу або функції, яка створюється за шаблоном, містить однаковий базовий код; змінюється тільки те, що пов'язано з параметрами шаблона. При цьому ефективність роботи версій, які створюються для різних типів даних, може сильно розрізнятися.

Якщо для якого-небудь типу даних існує більш ефективний код, можна або передбачити для цього типу спеціальну реалізацію окремих методів, або повністю перевизначити (спеціалізувати) шаблон класу. Для спеціалізації методу вимагається визначити варіант його коду, вказавши в заголовку конкретний тип даних. Наприклад, якщо заголовок узагальненого методу print шаблона List має вид

template <class Data>  void List <Data>::print():

спеціалізований метод для виведення списку символів виглядатиме наступним чином:

void

List <char>::print()

{

... // Тіло спеціалізованого варіанту методу print

}

Якщо в програмі створити екземпляр шаблона List типу char, відповідний варіант методу буде викликаний автоматично. При спеціалізації цілого класу після опису узагальненого варіанту класу поміщається повний опис спеціалізованого класу, при цьому вимагається наново визначити всі його методи. Припустимо, вимагається спеціалізувати шаблон Block для зберігання 100 цілих величин:

class Block<int, 100>

{

public:

Block()

{

p = new int [100];

}

~Block()

{

delete [] p;

}

operator int *();

protected:

int * p;

};

Block<int. 100>::operator int *()

{

return p;

}

При визначенні екземплярів шаблона Block з параметрами int і 100 буде задіяний спеціалізований варіант.

Переваги і недоліки шаблонів

Шаблони є могутнім і ефективним засобом поводження з різними типами даних, яке можна назвати параметричним поліморфізмом, а також забезпечують безпечне використання типів, на відміну від макросів препроцесора. Проте слід мати на увазі, що програма, яка використовує шаблони, містить повний код для кожного породженого типу, що може збільшити розмір виконуваного файлу. Крім того, з деякими типами даних шаблони можуть працювати не так ефективно, як з іншими. В цьому випадку має сенс використовувати спеціалізацію шаблона. Стандартна бібліотека C++ надає великий набір шаблонів для різних способів організації зберігання і обробки даних.


 

А также другие работы, которые могут Вас заинтересовать

37508. Философия. Основные понятия и термины 95.72 KB
  ИСТОРИЯ ТЕХНИКИ наука о развитии технических систем см. С точки зрения естественных наук история техники изучает этапы овладения человеком законами природы что обеспечивает более глубокое и разностороннее использование и применение вещества и энергии природы. С социальной точки зрения история техники изучает общественные движущие силы общественные условия развития техники и роль творцов техники. К наиболее крупным периодам истории техники относятся: история каменного века и ручных орудий техники машин и механизации техники...
37509. Апология Сократа 15.75 KB
  Ксенофонт посвятил Сократу и его учению свои произведения Апология Сократа и Воспоминания о Сократе . Платон же почти все свое учение приписал Сократу так что трудно сказать где кончается Сократ а где начинается Платон Отсутствие прямой информации непосредственно исходящей от Сократа приводит к тому что некоторые историки античной философии в последние десятилетия не раз делали попытки доказать что Сократ всего лишь литературный персонаж. Вопросный метод Сократа Подход Сократа к вопросному методу основан на ведении последовательного...
37510. Патристика и Схоластика 93.75 KB
  К этим принципам относятся: теоцентризм признание в качестве источника всего сущего Бога; креационизм признание того что Бог создал все из ничего; провиденциализм признание того что Бог правит всем; персонализм признание того что человек âперсонаâ сотворен Богом по собственному подобию и наделен совестью; ревеляционизм признание того что самый надежный путь познания наиболее важных для человека истин состоит в постижении смысла Священного писания. И все же на переднем плане осталась проблема человека и его...
37511. Философия. Сборник тестов 425.5 KB
  Предмет и специфика философии. Мировоззрение и философия. Общий обзор исторических типов философии. Античная философия.2 Философия. Средневековья. Философия Возрождения. Философия Нового времени. Немецкая классическая философия. Философия марксизма. Русская философия. Современная западная философия...
37512. Философия. Шпаргалка 363 KB
  Из объемных фигур происходят чувственно воспринимаемые тела которые имеют четыре основы огонь воду землю и воздух; превращение последних приводят к миру живого и человека. Кризис Конечно можно отказаться от атомизма но тогда что делать с парадоксами и апориями элеатов Сюда добавляется еще одна трудность: неясно как подступиться с атомистическими воззрениями к духовному миру человека. Проблема Предлагаемое решение Что удалось объяснить Что не удалось объяснить Что есть единое Материальная субстанция Часть природных явлений...
37514. Философия. Краткий конспект 20.02 KB
  11 Философия Пифагор: Мир не хаос мир подчиняется строгим математическим законам. Средневековая философия. С 5 века по 11 век европейская философия по 16 восточная философия. Гуманистическая философия т.
37515. Специфика мифологического мировоззрения 11.53 KB
  Мифологическое мировоззрение характеризуется преимущественно игнорированием причинноследственных методов описания действительности в результате чего картина мира предстает только в ее пространственновременном оформлении например в нереальных сроках жизни людей их перерождении и воскрешении в другом качестве и т. Мифологическое мировоззрение обладает еще одной особенностью в мифе всегда есть присутствие целостного представления между природной субстанцией и самим человеком. Поэтому мифологическое сознание сначала растворяется в...