Опубликован: 25.08.2010 | Доступ: свободный | Студентов: 6394 / 711 | Оценка: 3.91 / 3.44 | Длительность: 11:09:00
Лекция 6:

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

< Лекция 5 || Лекция 6: 1234

Использование шаблонов классов

Чтобы создать при помощи шаблона конкретный объект конкретного класса, при описании объекта после имени шаблона в угловых скобках перечисляются его фактические параметры:

имя_шаблона <фактические параметры> имя_объекта (параметры_конструктора);

Процесс создания конкретного класса из шаблона путем подстановки аргументов называется инстанцированием шаблона.Имя шаблона вместе с фактическими параметрами можно воспринимать как уточненное имя класса. Примеры создания объектов по шаблонам:

List <int> List_int;  // список целых чисел
List <double> List_double; // список вещественных чисел
List <monster> List_monster; // список объектов класса monster
Block <char, 128> buf;       // блок символов
Block <monstr, 100> stado;   // блок объектов класса monster
Pair<int, int> a;            // объявление пары целых
Pair<int, double> b;         // объявление пары "целый, вещественный"
Pair<int, double> b = { 1, 2.1 };  // объявление с инициализацией
Pair<string, Date> d;        // аргументы - пользовательские классы

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

template<class T = char> class String;
String<>* p;

Для каждого инстанцированного класса компилятор создает имя, отличающееся и от имени шаблона, и от имен других инстанцированных классов. Тем самым каждый инстанцированный класс определяет отдельный тип. В классе-шаблоне разрешено объявлять статические методы и статические поля, однако следует учесть, что каждый инстанцированный класс обладает собственной копией статических элементов.

После создания объектов с ними можно работать так же, как с объектами обычных классов, например:

for (int i = 1; i<10; i++)List_double.add(i*0.08);
List_double.print();
//----------------------------------
for (int i = 1; i<10; i++)List_monster.add(i);
List_monster.print();
//----------------------------------
strcpy(buf, "Очень важное сообщение");
cout << buf << endl;

Для упрощения использования шаблонов классов можно применить переименование типов с помощью typedef:

typedef List <double> Ldbl;
Ldbl List_double;

Достоинства и недостатки шаблонов

Шаблоны представляют собой мощное и эффективное средство обращения с различными типами данных, которое можно назвать параметрическим полиморфизмом, обеспечивают безопасное использование типов, в отличие от макросов препроцессора, и являются вкупе с шаблонами функций средством реализации идей обобщенного программирования и метапрограммирования. Однако следует иметь в виду, что эти средства предназначены для грамотного использования и требуют знания многих тонкостей. Программа, использующая шаблоны, содержит код для каждого порожденного типа, что может увеличить размер исполняемого файла. Кроме того, с одними типами данных шаблоны могут работать не так эффективно, как с другими. В этом случае имеет смысл использовать специализацию шаблона (о специализации шаблонов можно прочитать в учебнике [18]).

Стандартная библиотека С++ предоставляет большой набор шаблонов для различных способов организации хранения и обработки данных.

На этом данный курс лекций завершается. В него не вошли многие темы, рассмотренные в учебнике [18] и практикуме [19]: шаблоны функций, основы структурной и объектно-ориентированной технологии разработки программ, организация динамических структур данных, обработка исключительных ситуаций, преобразование типов, введение в паттерны проектирования, описание стандартной библиотеки (потоковые классы, строки, контейнеры, итераторы, функциональные объекты, алгоритмы и другие средства). Это связано с формулировкой договора, заключенного автором с издательством ПИТЕР при публикации книги.

< Лекция 5 || Лекция 6: 1234
Dana Kanatkyzi
Dana Kanatkyzi
Здравствуйте.Помогите решить задачу минимум 4 чисел.Условие такое:"Напишите функцию int min (int a, int b, int c, int d) (C/C++)"находящую наименьшее из четырех данных чисел."Заранее спасибо!