Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5fan_ru_Obektno-orientirovannoe_programmirovan...doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
352 Кб
Скачать
☆

Void main(void)

{

int i=15; float f=3.12;

double x=3.1e2

cout << “целое” << cub(i) <<”\n”;

cout <<”вещественное” << cub(f) <<”\n”;

cout <<”двойной точности” << cub(x) <<”\n”;

return 0;

}

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

Листинг 8.2

//Шаблон функции, осуществляющей перестановку двух переданных параметров.

Void Swap ( SwapType &X, SwapType &y)

{

SwapType temp;

Temp=x;

x=y;

y=temp;

}

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

Листинг 8.3.

// Шаблон функции для нахождения максимального из двух величин

template < class T1, class T2 >

T1 max( T1 x, T2 y)

{

if( x>y)

return x;

else

return y;

}

Рассмотрим, вопрос о типе возвращаемого значения функции, приведенной в листинге 8.3.

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

Void main(void)

{

Int a, double b;

// операторы

max( b, a);

// операторы

}

В этом случае в качестве типа возвращаемого значения - T1 будет использовано имя переменной старшего типа, и потери не произойдет.

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

Шаблон класса представляет собой скелет обобщенного класса.

Синтаксис объявления шаблонного класса:

template < список_аргументов_шаблона >

class имя_класса

{

//тело класса

};

Каждый аргумент является:

  1. либо именем типа, за которым следует идентификатор, например:

float a;

  1. либо ключевым словом class, за которым следует идентификатор, обозначающий параметризированный тип, например:

class T.

Общий вид определения функции - метода шаблонного класса

template <список_аргументов_шаблона>

тип_результата имя_класса <список_аргументов_шаблона>

:: имя_функции(список_аргументов_функции)

{

// операторы

}

Объявление объекта шаблонного класса:

имя_класса_шаблона <список_аргументов_шаблона> имя объекта;

Пример использования шаблонного класса для организации очереди объектов параметризированного типа приведен в листинге 8.4.

Листинг 8.4.

// Использование шаблона класса для организации очереди объектов

//параметризированного типа

#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++];

}

/*************************************************/