Глава 8. Параметризованные функции и классы 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Глава 8. Параметризованные функции и классы



Шаблоны функций.

Простейший шаблон функции имеет форму:

template <class Type> <заголовок>

{

<тело функции>

}

В общем случае шаблон функции может содержать несколько параметров, каждый из которых может быть не только типом, но и просто переменной.

Пример 1

template <class A, class B, int i> void f() {...}

Шаблон функции использует в качестве аргумента тип переменной.

Пример 2

template<class T> Tsgr_it(T x)

{

...

return x*x;

}

В шаблоне может использоваться необязательный первый тип как параметр

Пример 3

template<class T1, class T2>

Max(T1 x, T2 y)

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

В C++ вызов шаблона функции, использующий конкретный тип данных, приводит к тому, что компилятор создает код соответствующей версии функции. Этот процесс называется инстанцированием. Конкретный тип для инстанцирования определяется компилятором автоматически, исходя из типов параметров при вызове функции, либо задается явным образом. При повторном вызове с тем же типом данных код заново не генерируется. Если на месте параметра шаблона находится не тип, а переменная, то должно указываться константное выражение.


Пример 4

Явное задание аргументов при вызове:

template<class x, class y, class z>void (x, y, z);

Void g()

{

f < int, char*

}

Как и обычные функции, шаблоны функций могут быть перегружены как с помощью шаблона, так и с помощью обычной функции. В программе можно предусмотреть специальную обработку.


 

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

Шаблоны классов (параметризованные классы) рассматриваются как описание множества классов, моделирующих абстрактные структуры данных и отличающихся типом полей, включенных в эту структуру. Шаблоны классов определяют правила построения каждого отдельного класса из множества разрешенных (допустимых) классов. Синтаксис описания шаблона класса выглядит так:

Template <список параметров шаблона>. <описание класса>

В списке параметров шаблона могут быть как параметры, определяющие тип, так и параметры, для которых этот тип фиксирован. Каждый формальный параметр, определяющий тип, обозначается ключевым словом class. Используя шаблоны, можно определить объекты класса. Формат определения объекта одного из классов, порождаемых шаблоном, выглядит так:

Имя_парметра_класса <список параметров шаблона>

Имя_объекта (параметры конструктора)

Пример 1

Template<class T, int, size>

Class queue

{

T *g;

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=newT[size]))

{

cout<<”not enough memory”;

return;

}

sloc=rloc=0;

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

}

template<class T, int, size>

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

{

delete q;

cout <<”очередь разр.”;

}

template<class T, int, size>

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

{

if(sloc==size)

{

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

return;

}

q[sloc++]=i;

}

template<class T, int, size>

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

{

if(rloc==sloc)

{

cout<<” очередь пуста”;

}

return q[rloc++];

}

Main()

{

queue<int, 5> a;

queue <double, 200> b;

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

a: qput(10);

b: qput(1.129);

a: qput(23);

b: qput (5.55);

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”;

return 0;

}

Else

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

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

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

for(i=0; i<s; i++) /* просмотр элементов */

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

cout<<”\n”;

delete pq;

return pq;

}



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 179; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.174.76 (0.008 с.)