Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ - ООП.doc
Скачиваний:
11
Добавлен:
21.09.2019
Размер:
399.87 Кб
Скачать

Void main(void)

{

int i=10;

float f=1.1;

long l=2345;

long double id=123.1e+123;

cout<<”int”<<sqr_it(i)<<endl;

cout<<”float”<<sqr_it(f)<<endl;

cout<<”long”<<sqr_it(l)<<endl;

cout<<”long double”<<sqr_it(id)<<endl;

}

В шаблоне функции может использоваться необязательно один тип как параметр шаблона. Например, функции max (a,b) с различными типами аргументов могут быть определены следующим образом:

template <class T1, class T2>

T max(T1 x,T2 y)

{ return (x>y)?x:y; };

Возвращаемый тип T1. Для того, чтобы функции возвращали результат без потери значения, при вызове функции желательно переменную или константу “старшего” типа использовать в качестве первого аргумента.

Пример:

include <iostream.h>

template <class T1,class T2>

T maximum(T1 x,T2 y)

{

if(x>=y) return x;

return y;

};

Void main(void)

{

int i=10;

double d=1.2345;

long l=123456;

long double ld=1.1e+123;

cout<<”максимум из “<<d<<” и “<<i<<” равен “<<maximum(d,i)<<endl;

cout<<”максимум из “<<i<<” и “<<d<<” равен “<<maximum(i,d)<<endl;

cout<<”максимум из “<<ld<<” и “<<l<<” равен “<<maximum(ld,l)<<endl;

}

Шаблоны классов

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

В качестве параметра при задании шаблона класса может использоваться не только тип, но и другие параметры, например целочисленные значения (но эти параметры должны быть константными выражениями).

Преобразуем класс queue, задав этот класс шаблоном. Параметрами шаблона будет тип массива, входящего в класс queue, и размер size этого массива.

#include <iostream.h>

template <class T, int size>

class queue

{

T *q;

Int sloc, rloc;

public:

queue(void); // конструктор

~queue(void); // деструктор

Void qput(t I);

T qget(void);

};

template <class T, int size> // следует обратить внимание на синтаксис

queue<T, size>::queue(void) // описание функции-конструктора

{

if (!(q=new T[size]))

{

cout<<”Недостаточно памяти \n”;

return;

}

sloc=rloc=0;

cout<<”Очередь размера ”<<size<<” инициализирована \n”;

}

template <class T, int size>

queue<T, size>::~queue(void) // описание функции-деструктора

{

delete q; cout<<” Очередь разрушена \n”;

}

template <class T, int size>

void queue<T, size>::qput(T i)

{

if(sloc= =size)

{

cout<<” Очередь полна \n”;

return;

}

q[sloc++]=i;

}

template <class T, int size>

T queue<T, size>::qget(void)

{

if(rloc= =sloc)

{

cout<<” Очередь пуста \n”; return 0;

}

return q[rloc++];

}

Void main(void)

{

queue<int,5> a;

queue<double, 200> b;

// объявление двух объектов класса queue с массивами разных типов и разных размеров

a.qput(10);

b.qput(1.234);

a.qput(1);

b.qput(2.3456);

cout<<a.qget()<<” “;

cout<<a.qget()<<” “;

cout<<b.qget()<<” “;

cout<<b.qget()<<” \n“;

const int s=10;

queue<long double,s> *pq;

pq = new queue<long double, s>;

// Динамическое создание объекта, именно сейчас вызывается конструктор queue

if((!pq)

{

cout<<”\n Недостаточно памяти \n”;

return 0;

}

else

cout<<”\n Объект класса queue создан \n”;

for (int i=0;i<s;i++)

pq->qput((i/2.0+i); // заполнение очереди

for ( i=0;i<s;i++)

cout<<pq->qget()<<” “;

cout<<endl;

delete pq;

}