- •1)Краткий обзор основных парадигм программирования
- •13) Класс как область видимости
- •19) Конструктор преобразования и конструкторы с двумя и более параметрами
- •25) Порядок вызова конструкторов и деструкторов
- •31) Перегрузка функций
- •37) Закрытое (private) наследование
- •43) Абстрактные классы. Чистые виртуальные функции
- •49) Интерфейсы
- •55) Шаблонные классы
55) Шаблонные классы
Так же, как и для функций, можно описать шаблоны для классов. Механизм шаблонов при описании класса позволяет, например, обобщенно описывать множество классов, единственное отличие которых заключается в используемых типах данных.
Объявление шаблона класса:
template Список_параметров шаблона class Имя класса {. . .};
Процесс генерации объявления класса по шаблону класса и фактическим аргументам шаблона называется инстанцированием шаблона. Обычно он совмещается с объявлением объекта соответствующего конкретного типа. Синтаксис такого объявления:
Имя класса Список_параметров шаблона Идентификатор объекта;
Функции-члены класса-шаблона автоматически становятся функциями-шаблонами. Для них не обязательно явно задавать ключевое слово template.
Дружественная функция, которая использует параметры шаблона, сама является шаблоном. Конкретная реализация такой функции с учётом специфицированных параметров (порожденная функция) является дружественной для такого инстанцирования класса, которое совпадает по типам с фактическими типами аргументов порожденной функции.
Пример:
template <class T> class Y{ . . .};
template <class T> class X
{
// . . .
public:
friend void f1();
// функция f1() является
// дружественной ко всем
// инстанцированиям
// класса
friend Y f2(Y par1);
// порождение функции f2()
// для фактического типа T
// является дружественной
// только к тому
// инстанцированию класса
// X, которое подходит по
// фактическому
// типу–параметру.
// . . .
};
template Y f2(Y par1)
{ /* . . . */ }
Статические члены создаются для каждого инстанцирования класса.
Пример:
template class X {
static T x1;
// . . .
};
int X :: x1 = 0;
double X :: x1 = 1.5;
int main() {
X <int>xx1;
X <double>xx2;
. . .
return 0; }
61)/* Создается класс Student. Формируется динамический массив объектов. При
тестировании выводится: сформированный список студентов, список студентов
заданного факультета, список студентов для заданных факультета и курса.*/
#include <conio.h>
#include <string.h>
#include <iostream.h>
struct date // дата рождения
{char daymon[6];
int year; };
//======= class Student =================
class Student{
char name[30]; //private
date t;
char adr[30], fac[20];
int kurs;
public:
Student();
char *getfac();
int getkurs();
void show();
};
Student::Student()
{cout<<"Input name:"; cin>>name;
cout<<"Input date of born\n";
cout<<"Day.mon:"; cin>>t.daymon;
cout<<"Year:"; cin>>t.year;
cout<<"Input adr:"; cin>>adr;
cout<<"Input fac:"; cin>>fac;
cout<<"Input kurs:"; cin>>kurs;
}
void Student::show()
{
cout<<"Name :"<<name<<endl;
cout<<"Was born :"<<t.daymon<<'.'<<t.year<<endl;
cout<<"Address :"<<adr<<endl;
cout<<"Fac :"<<fac<<endl;
cout<<"Kurs :"<<kurs<<endl;
}
char *Student::getfac() { return fac; }
int Student::getkurs() { return kurs; }
void spisfac(Student spis[],int n)//список студентов заданного факультетата
{char fac[20];
cout<<"Input faculty:"; cin>>fac;
for(int i=0;i<n;i++)
if(strcmp(spis[i].getfac(),fac)==0)spis[i].show();
}
void spisfackurs(Student spis[],int n)
//список студентов заданных факультета и курса
{int i,k;
char fac[20];
cout<<"Input faculty:"; cin>>fac;
cout<<"Input the course:"; cin>>k;
for(i=0;i<n;i++)
if ((strcmp(spis[i].getfac(),fac)==0)&&(spis[i].getkurs()==k))
spis[i].show();
}
//========= main ================
void main()
{ Student *spis;
int n;
cout<<"Input a number of students: "; cin>>n;
spis=new Student [n];
for(int i=0;i<n;i++) {
cout<<"=============================="<<endl;
spis[i].show();
}
spisfac(spis,n);
spisfackurs(spis,n);
delete [] spis;
cout<<"press any key!"
while(!kbhit());
}
