Основные свойства шаблонов классов
Компонентные функции параметризованного класса автоматически являются параметризованными. Их не обязательно объявлять как параметризованные с помощью template.
Дружественные функции, которые описываются в параметризованном классе, не являются автоматически параметризованными функциями, т.е. по умолчанию такие функции являются дружественными для всех классов, которые организуются по данному шаблону.
Если friend-функция содержит в своем описании параметр типа параметризованного класса, то для каждого созданного по данному шаблону класса имеется собственная friend-функция.
В рамках параметризованного класса нельзя определить friend-шаблоны (дружественные параметризованные классы).
С одной стороны, шаблоны могут быть производными (наследоваться) как от шаблонов, так и от обычных классов, с другой стороны, они могут использоваться в качестве базовых для других шаблонов или классов.
Шаблоны функций, которые являются членами классов, нельзя описывать как virtual.
Локальные классы не могут содержать шаблоны в качестве своих элементов.
Статические переменные шаблонов классов необходимо инициализировать для каждого используемого типа данных.
Рассмотрим пример:
include <iostream.h>
template <class Type> class Template_Class
{
static int Cout;
Type peremenaya;
public:
Template_Class(Type peremenaya)
{
this->peremenaya=peremenaya;
Cout++;
}
Type& get(){return peremenaya;}
friend ostream& operator<<(ostream &os,Template_Class &Obj)
{
return os<<"Peremenaya"<<Cout<<"="<<Obj.peremenaya<<endl;
}
};
int Template_Class<int>::Cout=0;
int Template_Class<char*>:: Cout =0;
main()
{
Template_Class<int> Num(50);
Template_Class<char*> Str("Пример");
cout<<Num<<Str;
Num.get()++;
Str.get()="Привет";
cout<<Num<<Str;
Template_Class<int> Obj(10);
cout<<Obj;
return 0;
}
Компонентные функции
Реализация компонентной функции шаблона класса, которая находится вне определения шаблона класса, должна включать дополнительно следующие два элемента:
Определение должно начинаться с ключевого слова template, за которым следует такой же список_параметров_типов в угловых скобках, какой указан в определении шаблона класса.
За именем_класса, предшествующим операции области видимости (::), должен следовать список_имен_параметров шаблона.
template<список_типов>тип_возвр_значения имя_класса<список_
имен_ параметров> : : имя_функции(список_параметров){ . . . }
Порядок выполнения работы.
1. Создать шаблон класса. Определить конструкторы, деструктор и все дополнительно необходимые операции. Класс создается по выбору студента.
2. Класс должен содержать статические компоненты.
3. Написать программу тестирования, в которой проверяется использование шаблона для стандартных типов данных.
4. Выполнить тестирование.
5. Определить пользовательский класс, который будет использоваться в качестве параметра шаблона. Определить в классе необходимые функции и перегруженные операции.
6. Написать программу тестирования, в которой проверяется использование шаблона для пользовательского типа.
7. Выполнить тестирование.
8. Создать шаблон функции согласно варианту.
9. Написать программу тестирования, в которой проверяется использование шаблона функции для предлагаемых типов данных.
10. Выполнить тестирование.
Варианты заданий.
Вариант 1
Шаблон функции MIN() возвращающая минимальное значение для двух чисел, символов и вещественных чисел и протестировать её.
Вариант 2
Шаблон функции MAX() возвращающая максимальное значение для двух чисел, символов и вещественных чисел и протестировать её.
Вариант 3
Шаблон функции INVERSIA(), выводящую элементы в обратном порядке их следования, для строки и целых чисел и протестировать ее;
Вариант 4
Шаблон функции SORT(), реализующую сортировку данных по возрастанию по методу выборки, переопределить ее для длинных целых, и вещественных чисел и протестировать её.
Вариант 5
Шаблон функции SORT(), реализующую сортировку данных по убыванию по методу включения, переопределить ее для длинных целых, и вещественных чисел и протестировать её.
Вариант 6
Шаблон функции SORT(), реализующую сортировку данных по возрастанию по методу обменов, переопределить ее для длинных целых, и вещественных чисел и протестировать её.
Вариант 7
Шаблон функции SORT(), реализующую сортировку данных по убыванию по методу распределения, переопределить ее для длинных целых, вещественных чисел и строк и протестировать её.
Вариант 8
Шаблон функции SORT(), реализующую сортировку данных по возрастанию по методу быстрой сортировки, переопределить ее для длинных целых, и вещественных чисел и протестировать её.
Вариант 9
Шаблон функции SORT(), реализующую сортировку данных по убыванию по методу слияния, переопределить ее для длинных целых, и вещественных чисел и протестировать её.
Вариант 10
Шаблон функции FIND(), реализующую поиск данных по методу бинарного поиска, переопределить ее для длинных целых, и вещественных чисел и протестировать её.
Содержание отчета.
1. Титульный лист: название дисциплины, номер и наименование работы, фамилия, имя, отчество студента, дата выполнения.
2. Постановка задачи.
3. Следует дать конкретную постановку, т.е указать шаблон какого класса должен быть создан, какие должны быть в нем конструкторы, компоненты-функции, перегруженные операции и т.д.
4. То же самое следует указать для пользовательского класса.
5. Определение шаблона класса с комментариями.
6. Определение пользовательского класса с комментариями.
7. Реализация конструкторов, деструктора, операции присваивания и операций, которые заданы в варианте задания.
8. То же самое для пользовательского класса.
9. Результаты тестирования. Следует указать для каких типов и какие операции проверены и какие выявлены ошибки (или не выявлены)
Контрольные вопросы
1. В чем смысл использования шаблонов?
2. Каковы синтаксис/семантика шаблонов функций?
3. Каковы синтаксис/семантика шаблонов классов?
4. Перечислите основные свойства параметров шаблона функции.
5. Как записывать параметр шаблона?
6. Можно ли перегружать параметризованные функции?
7. Перечислите основные свойства параметризованных классов.
8. Может ли быть пустым список параметров шаблона? Объясните.
9. Как вызвать параметризованную функцию без параметров?
10. Все ли компонентные функции параметризованного класса являются параметризованными?
11. Являются ли дружественные функции, описанные в параметризованном классе, параметризованными?
12. Могут ли шаблоны классов содержать виртуальные компонентные функции?
13. Как определяются компонентные функции параметризованных классов вне определения шаблона класса?
Лабораторная работа № 15
«ПОТОКОВЫЕ КЛАССЫ»
Цель. Научиться программировать ввод и вывод в С++, используя объекты потоковых классов стандартной библиотеки С++. Создание пользовательского типа данных, создание и сохранение объектов этого типа в файле, чтение их из файла, удаление из файла, корректировка в файле, создание пользовательских манипуляторов.