Программирование >>  Расширенная версия языка c++ 

1 ... 105 106 107 [ 108 ] 109 110 111 ... 227


5. Родовые функции похожи на перегруженные функции за исключением того, что они более ограничены по своим возможностям. При перегрузке функции внутри ее тела можно выполнять совершенно разные действия. С другой стороны, родовая функция должка выполнять одни и те же базовые действия для всех своих версий. Например, следующие перегруженные функции нельзя заменить на родовую функцию, поскольку они делают не одно и то же.

cout i;

void d)

cout setprecision(lO) setf ill (# );

cout d;

cout

} . ..\:

6. Несмотря на то, что функция-шаблон при необходимости перегружается сама, ее также можно перегрузить явно. Если вы сами перегружаете родовую

функцию, то перегруженная функция подменяет (или скрывает ) родовую функцию, которую бы создал компилятор для этой конкретной версии. Рассмотрим такой вариант примера 1:

Подмена функции-шаблона .

ttinclude -ciosti:eain> -

using namespace std; -

template <class X> void X

X temp; temp =

a = Ь; ; -

b = temp;

ecb переопределяется родовая версия функции swapargs () void swapargs (in;: a, int b)

cout < это печатается внутри функции swapargs(int, int)\n ;

int main 0

int i = 10 , j = 20; -

float X = ЮЛ, у = 23.3;

cou.--. Исходные значения i, j равные j endl;

cout Исходные значения x, у равны: x у endl;



эзКйения]

1. Если этого еще не сделано, попытайтесь откомпилировать каждый из предыдущих примеров.

2. Напишите родовую функции mn(), возвращающую меньший из двух своих аргументов. Например, версия функции min(3, 4) должна возвратить 3, а версия min(c, а) - а. Продемонстрируйте работу функции с помощью программы.

3. Прекрасным кандидатом шаблон является функции d(). Эта функция ищет объект в массиве. Она возвращает либо индекс найденного объекта (если его удалось найти), либо - I. если заданный объект не найден. Ниже представлен прототип конкретной версии функции flndQ. Переделайте функцию find() в родовую функцию и проверьте ваше решение в программе. (Параметр size задает количество элементов массива.)

in (int object st, int size)

...

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

swapargs (i, j) ; зов явно перегруженной функции swapargsO

swapargs (х, у) ; обмен действительными числами

cou Новые значения i, j равные j endl; cout Новые значения х, у endl;

return 0;

J : .1:14г...

: j fjjf ,; I. 1 . гг.. , : - ii; .. :

Как отмечено в комментариях, при вызове функции rgs(i, j) вызывается определенная в программе явно перегруженная версия функции swapargs(). Таким образом, компилятор не генерирует этой версии родовой функции swapargsO, поскольку родовая функция подменяется явно перегруженной

функцией.

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

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



332 Самоучитель С++

11.2. Родовые классы

В дополнение к родовым функциям можно определить и родовые классы. При этом создается класс, в котором определены все необходимые алгоритмы, а фактические типы обрабатываемых данных задаются в качестве параметров позже, при создании объектов этого класса.

Родовые классы полезны, когда класс содержим шую логику работы. Например, алгоритм, который реализует очередь целых, будет также работать и с очередью символов. Кроме того, механизм, который реализует связанный список почтовых адресов, будет также поддерживать связанный список запасных частей к автомобилям. С помощью родового класса можно создать

класс, реализующий очередь, связанный список и т. д. для любых типов данных. Компилятор будет автоматически генерировать правильный тип

объекта на основе типа, заданного при создании объекта. Ниже представлена основная форма объявления родового класса: template <clas claaa имя класса {

Здес - это фиктивное имя типа, который будет задан при создании

экземпляра класса. При необходимости можно определить более одного родового типа данных, разделяя их запятыми.

После создания родового класса с помощью представленной ниже формах можно создать конкретный экземпляр этого класса:

1шя хлаасл <*жп> объект; . .i i

Здесь тип - это имя типа данных, с которым будет оперировать класс.

Функции-члены родового класса сами автоматически становятся родовыми. Для них не обязательно явно задавать ключевое слово template.

Как вы увидите в главе 14, в C++ имеется встроенная библиотека классов-шаблонов, которая называется библиотекой стандартных шаблонов (Standard Template Library, STL). Эта библиотека предоставляет родовые версии классов для наиболее часто используемых алгоритмов и структур данных. Чтобы научиться пользоваться библиотекой стандартных шаблонов с максимальной

эффективностью, вам необходимо иметь твердые знания по классам-

шаблонам и их синтаксису.

Примеры

L В следующей программе создается очень простой родовой класс, реализующий односвязный список. Затем демонстрируются возможности такого класса путем создания связанного списка для хранения символов.



1 ... 105 106 107 [ 108 ] 109 110 111 ... 227

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика