Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Теоретичні відомості. Шаблони. Шаблон (template) — це механізм параметризації визначення класу чи функції довільним типом

Читайте также:
  1. Uml; Основні теоретичні положення
  2. Uml; Основні теоретичні положення
  3. А) натурфілософських дослідження феноменів, витоків життя і свідомості в самій природи
  4. Банк - юридична особа, яка на підставі банківської ліцензії має виключне право надавати банківські послуги, відомості про яку внесені до Державного реєстру банків.
  5. Відомості про динаміку Землі
  6. Відомості про кримінальні правопорушення, вчинені неповнолітніми, за якими закінчено досудове розслідування за 6 місяців 2014 року
  7. Відродження української національної свідомості у першій половині 19ст. Діяльність Кирило-Мефодіївського братства.
  8. Вплив Визвольної війни (Національної революції ) середини XVII ст. на формування національної самосвідомості українців
  9. ГЛАВА 2. Теоретичні основи харчування
  10. Дослідження циклічних алгоритмів для формування та виводу на екран ASCII кодованих символів.Теоретичні відомості

Шаблони. Шаблон (template) — це механізм параметризації визначення класу чи функції довільним типом. Шаблони дозволяють застосовувати простий спосіб введення різного роду загальних концепцій та методів їх спільного використання. Результуючий код за ефективністю не поступається написаному вручну спеціалізованому коду. Клас, що утворюється із шаблону класу у разі конкретного задання значення параметра, є цілком нормальним класом, тому шаблон класу називають генератором типів. Такий процес генерації оголошення класу чи функції за шаблоном та аргументом шаблону називають інстанціюванням. Якщо має місце генерація різних версій шаблону для різних значень параметра, то кожну з цих версій називають спеціалізацією.

Стандартна бібліотека С++ містить класи-контейнери, реалізовані у формі шаблонів. Ось деякі з них:

vector одновимірний масив елементів

list двозв’язний список елементів

deque черга елементів з двома кінцями

stack стек елементів

map асоціативний масив елементів

set множина елементів

Шаблон може мати кілька параметрів, які можуть бути: класами, стандартними типами, шаблонами; аргумент шаблону може бути константним виразом, адресою об’єкта чи функції; не може бути рядковим літералом. Допускаються значення аргументів шаблонів за замовчуванням, синтаксис та правила використання аналогічні з аргументами функцій за замовчуванням. Одна спеціалізація вважається більш спеціалізованою за іншу, якщо список аргументів першої спеціалізації відповідає другій, а не навпаки. Генеруючи типи, перевагу віддають більш спеціалізованим версіям:

template<class T> class Vector // шаблон

{ T* v;

int size;

public:

Vector();

Vector(int);

//...

};

Наведемо приклад створення об’єкта параметризованого класу:

int main()

{ //...

Vector<int> vi;

Vector<char*> vpc;

Vector<double> vd;

//...

}

template<class T T default_value=0> class Vector<T*>

{ /*…*/};

//часткова спеціалізація Vector для значень параметра, поданих у вигляді T*

Vector<int**> vppi; // тут T - int*

template<> class Vector<void*>{/*…*/};

//повна спеціалізація без вказання параметра шаблону

Vector<void*> vpv;

Іноді параметр шаблону функції може бути виведений з типів її аргументів під час виклику, тому його не потрібно вказувати під час інстанціювання:

template<class T> void sort(Vector<T>& v) {/*…*/} //шаблон функції

sort(vi); //vi типу Vector<int>, не потрібно писати sort<int>

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

template<class T> T sqrt(T);

template<class T> complex<T> sqrt(complex<T>);

double sqrt(double);

void f(complex<double> z)

{

sqrt(2); //sqrt<int>(int)

sqrt(2.0); //sqrt(double)

sqrt(z); //sqrt<double>(complex<double>)

}

Шаблони можна ефективно використовувати для успадкування. Методику абстракції за допомогою шаблонів називають параметричним поліморфізмом або поліморфізмом часу компіляції на відміну від поліморфізму часу виконання, що забезпечується віртуальними функціями.

Можна створювати шаблони класів, що походять як від класу, що не є шаблоном, так і від шаблону класу. Класи чи шаблони класів можуть мати члени-шаблони. Члени-шаблони не можуть бути віртуальними.




Дата добавления: 2015-01-05; просмотров: 28 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав