![]() |
|
Программирование >> Расширенная версия языка c++
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 В следующей программе создается очень простой родовой класс, реализующий односвязный список. Затем демонстрируются возможности такого класса путем создания связанного списка для хранения символов.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |