
- •1. Объявление класса. Примеры. Понятие инкапсуляции, полиформизма, наследования.
- •2. Доступ к членам класса. Управление доступом к членам класса. Указатель this. Примеры.
- •3. Конструкторы и деструкторы. Параметризованные конструкторы. Примеры.
- •4. Дружественные ф-ции. Примеры.
- •5. Перегрузка функций. Значение аргументов ф-ции по умолчанию. Примеры.
- •6. Наследование. Примеры.
- •7. Передача объектов в ф-ции и возврат объекта из ф-ции. Массивы объектов. Примеры.
- •8. Перегрузка операторов при помощи функций-членов класса. Примеры.
- •9. Перегрузка операторов при помощи дружественных ф-ций. Примеры.
- •10. Ссылки, ссылки на объекты. Примеры.
- •11. Конструктор копирования. Примеры
- •12. Наследование и спецификаторы доступа. Примеры.
- •13. Конструкторы и деструкторы производных классов. Примеры.
- •14. Указатели и ссылки на производные типы. Примеры.
- •Ссылки на производные классы
- •15. Виртуальные ф-ции. Примеры.
- •16. Чисто виртуальные ф-ции и абстрактные классы. Примеры.
- •17. Обработка исключений. Примеры.
- •18. Создание собственных операторов вставки и извлечения. Примеры.
- •19. Файловый ввод-вывод. Примеры.
- •20. Формирование ввода-вывода. Примеры.
- •21. Двоичные файлы. Примеры.
- •22. Произвольный доступ. Примеры.
- •23. Ввод-вывод в массивы Примеры.
- •24. Класс string. Примеры.
- •25. Функции-шаблоны. Примеры.
- •Явная перегрузка функций-шаблонов
- •26. Классы-шаблоны. Примеры.
- •27. Пространства имён. Примеры.
- •28. Статические члены класса. Примеры.
- •30. Идентификация типа во время исполнения. Примеры.
- •31. Новые операторы приведения типов. Примеры.
- •32. Контейнерные классы. Примеры.
25. Функции-шаблоны. Примеры.
Функции-шаблоны создаются с использованием ключевого слова template (шаблон). Шаблон используется для создания каркаса функции, оставляя компилятору реализацию подробностей. Общая форма функции-шаблона имеет следующий вид:
template<class птип> возвращаемый_тип имя_функции(список параметров)
{
// тело функции
}
Здесь птип является параметром-типом, «держателем места» для имени типа данных, которое используется функцией. Этот параметр-тип может быть использован в определении функции. Он будет автоматически заменён компилятором на фактический тип данных во время создания конкретной версии функции.
Можно определить несколько типов-шаблонов данных в инструкции template, используя список с запятыми в качестве разделителя. Например, следующая программа создаёт функцию-шаблон имеющую два типа-шаблона.
Явная перегрузка функций-шаблонов
Хотя функция-шаблон перегружает себя по мере необходимости, также можно перегрузить её явным образом. Если перегружается функция – шаблон, то перегруженная функция переопределяет функцию шаблон для того конкретного набора типов параметров, для которых создаётся перегруженная функция. В качестве примера рассмотрим следующую версию функции swap().
Листинг // перегрузка функции-шаблона
#include <iostream>
using namespace std;
template <class X> void Swap(X &a, X &b) // шаблон функции
{
X temp;
temp=a;
a=b;
b=temp;
}
void Swap(int &a, int &b) // отдельная версия Swap()
{
int temp;
temp=a;
a=b;
b=temp;
cout << "Inside overloaded Swap().\n";
}
int main()
{
int i=10, j=20;
double x=10.1, y=23.3;
char a='x', b='z';
cout << "Original i, j: " << i << " " << j << "\n";
cout << "Original x, y: " << x << " " << y << "\n";
cout << "Original a, b: " << a << " " << b << "\n";
Swap(i, j);
Swap(x, y);
Swap(a, b);
cout << "Swapped i, j: " << i << " " << j << "\n";
cout << "Swapped x, y: " << x << " " << y << "\
cout << "Swapped a, b: " << a << " " << b << "\n";
return 0;}
26. Классы-шаблоны. Примеры.
Кроме функций – шаблонов можно также определить классы – шаблоны. Для этого следует создать класс, определяющий все алгоритмы, но фактический тип данных является параметром, определяющимся при создании класса.
Общая форма объявления класса – шаблона приведена ниже:
template <class птип> class имя_класса {
…
};
Здесь птип является параметром – типом, который будет указан при создании объекта класса. При необходимости можно определить несколько типов – шаблонов, используя список и запятую в качестве разделителя.
После создания класса – шаблона можно создать конкретный экземпляр класса и объекты этого класса, использую общую форму: имя_класса <тип> объект;
Здесь тип является именем типа данных, с которым будет оперировать данный класс.
Функции–члены класса–шаблона являются сами по себе автоматически шаблонами.
В следующей программе создаётся класс–шаблон stack, реализующий стандартный стек «последним вошёл – первым вышел». Он может использоваться для реализации стека с произвольным типом данных.
Листинг 4
#include <iostream> // демонстрация класса-шаблона stack
using namespace std;
const int SIZE = 100;
template <class SType> class stack{ // создание класса-шаблона stack
SType stck[SIZE];
int tos;
public:
stack();
~stack();
void push(SType i);
SType pop();
};
template <class SType> stack<SType>::stack() // функция-конструктор stack
{
tos = 0;
cout << "Stack initialized\n";
}
template <class SType> stack<SType>::~stack() // функция-деструктор stack
{
cout << "Stack destroyed\n";
}
template <class SType> void stack<SType>::push(SType i) // помещение объекта в стек
{
if(tos==SIZE) {
cout << "Stack is full.\n";
return;
}
stck[tos] = i;
tos++;
}
template <class SType> SType stack<SType>::pop() // извлечение объекта из стека
{
if(tos==0) {
cout << "Stack underflow.\n";
return 0;
}
tos--;
return stck[tos];
}
int main()
{
stack<int> a;
stack<char> c;
a.push(1);
a.push(2);
cout << a.pop() << " ";
cout << a.pop() << "\n";
register int i;
for(i=0; i<10; i++) c.push((char) 'A'+i);
for(i=0; i<10; i++) cout << c.pop();
cout << "\n";
getchar();
return 0;
}